3
3
4
4
package main
5
5
6
+ /*
7
+ typedef struct {
8
+ const char *filename;
9
+ int id;
10
+ } fileid_t;
11
+
12
+ const fileid_t *get_fileids() {
13
+ static fileid_t fileids[] = {
14
+ #define fileid__(f, id) { f, id },
15
+ #include "../../bpf/tetragon/fileids.h"
16
+ #undef fileid__
17
+ { NULL, -1 }
18
+ };
19
+ return fileids;
20
+ }
21
+
22
+ size_t get_fileids_len() {
23
+ const fileid_t *fileids = get_fileids();
24
+ size_t len = 0;
25
+ while (fileids[len].filename != NULL) {
26
+ len++;
27
+ }
28
+ return len;
29
+ }
30
+ */
31
+ import "C"
32
+
6
33
import (
7
- "bufio"
8
34
"encoding/json"
9
35
"fmt"
10
36
"os"
11
- "regexp"
12
- "strconv"
13
- "strings"
37
+ "unsafe"
14
38
)
15
39
16
40
// json entry
@@ -19,52 +43,37 @@ type Entry struct {
19
43
Filename string `json:"filename"`
20
44
}
21
45
22
- func initFileIDs ( fname string ) []Entry {
23
- entryRe := regexp . MustCompile ( `fileid__\("([^"]+)", *([0-9]+)\)` )
24
- f , err := os . Open ( fname )
25
- if err ! = nil {
26
- fmt .Fprintf (os .Stderr , "error opening '%s': %v" , fname , err )
46
+ func loadFileIDs ( ) []Entry {
47
+ fileidsLen := C . get_fileids_len ( )
48
+ cArrayPtr := C . get_fileids ( )
49
+ if cArrayPtr = = nil {
50
+ fmt .Fprintf (os .Stderr , "Failed to allocate C array." )
27
51
os .Exit (1 )
28
52
}
29
- defer f .Close ()
30
-
31
- ret := []Entry {}
32
- scanner := bufio .NewScanner (f )
33
- for scanner .Scan () {
34
- line := scanner .Text ()
35
- if strings .HasPrefix (line , "//" ) {
36
- continue
37
- }
38
-
39
- m := entryRe .FindStringSubmatch (line )
40
- if len (m ) == 3 {
41
- id , err := strconv .ParseInt (m [2 ], 0 , 32 )
42
- if err != nil {
43
- continue
44
- }
45
- ret = append (ret , Entry {int (id ), m [1 ]})
46
- }
47
-
53
+ goSlice := (* [1 << 30 ]C.fileid_t )(unsafe .Pointer (cArrayPtr ))[:fileidsLen :fileidsLen ]
54
+ var ret []Entry
55
+ for _ , fileid := range goSlice {
56
+ id := int (fileid .id )
57
+ name := C .GoString (fileid .filename )
58
+ ret = append (ret , Entry {id , name })
48
59
}
49
- // NB: no need to check scanner.Err()
50
60
return ret
51
61
}
52
62
53
63
func main () {
54
- if len (os .Args ) < 3 {
55
- fmt .Fprintf (os .Stderr , "Usage: %s <fileids.h> < out.json>\n " , os .Args [0 ])
64
+ if len (os .Args ) < 2 {
65
+ fmt .Fprintf (os .Stderr , "Usage: %s <out.json>\n " , os .Args [0 ])
56
66
os .Exit (1 )
57
67
}
58
68
59
- fname := os .Args [1 ]
60
- fileIDs := initFileIDs (fname )
69
+ fileIDs := loadFileIDs ()
61
70
b , err := json .MarshalIndent (fileIDs , "" , " " )
62
71
if err != nil {
63
72
fmt .Fprintf (os .Stderr , "error marshalling file ids: %v" , err )
64
73
os .Exit (1 )
65
74
}
66
75
67
- outFname := os .Args [2 ]
76
+ outFname := os .Args [1 ]
68
77
err = os .WriteFile (outFname , b , 0622 )
69
78
if err != nil {
70
79
fmt .Fprintf (os .Stderr , "error writing file: %v" , err )
0 commit comments