source: trunk/mkstructinfo.awk @ 169

Last change on this file since 169 was 169, checked in by moo, 8 years ago

comments/loops improved in mkstructinfo while avoiding gawk assertion bug with LANG=C

File size: 2.3 KB
Line 
1#! /usr/bin/awk -f
2# vim:ts=4:sw=4
3BEGIN {
4    brace = 0;
5    buffer_len = 0;
6}
7/^#/ {
8    next;
9}
10/^}.*;/ {
11    if (instruct) {
12        sub(";", "");
13        if (instruct == 1 && $2) {
14            instruct = $2;
15        }
16        if (instruct in typedefs) {
17            instruct = typedefs[instruct];
18        }
19        sizeinfo = "";
20        elms = "";
21        for (i = 0; i in buffer; i ++) {
22            if (i) {
23                sizeinfo = sizeinfo " + ";
24            }
25            sizeinfo = sizeinfo "sizeof(((" instruct "*)NULL)->" buffer[i] ")";
26
27            if (i == 0) {
28                elms = buffer[i];
29            }
30            else {
31                elms = elms "," buffer[i];
32            }
33        }
34        printf "define(`ELEMENTSOF_%s', `%s')\n", instruct, elms;
35        printf "define(`COUNTOF_%s', `%s')\n", instruct, i;
36        printf "define(`SIZEOF_%s', `(  %s  )')\n", instruct, sizeinfo;
37        print "\n";
38        for (i in buffer) {
39            delete buffer[i];
40        }
41        buffer_len = 0;
42        instruct = 0;
43    }
44    next;
45}
46
47/.\{/ {
48    brace = brace + 1;
49}
50/.}/ {
51    brace = brace - 1;
52}
53
54{
55    if (brace == 1 && instruct) {
56        gsub(/\/\*(.+?)\*\//, " "); # removes one line comment
57        sub(/.*[{}]/, "");
58        gsub(/\[[^\]]+\]/, ""); # ignore [...]
59        gsub(/:[0-9]+/, ""); # ignore struct bit
60        if (match($0, /^[^(]*\([ ]*\*([^)]+)\)/)) {
61            sub(/ +/, "")
62            sub(/^[^(]*\(\*/, "");
63            sub(/\).*/, "");
64            # function pointer
65            buffer[buffer_len] = $0;
66            buffer_len ++;
67        }
68        else {
69            # ignore any ()s
70            while (gsub(/(\([^)]*\))/, "")) {
71            }
72            if (match($0, /[()]/)) {
73                next;
74            }
75            # unsigned int *a,  b; int c;
76            gsub(/[*]/, " ");
77            # unsigned int a,  b; int c;
78            gsub(/ +/, " ");
79            # unsigned int a, b; int c;
80            gsub(/ *[,;]/, ";");
81            # unsigned int a; b; int c;
82            if (!match($0, /;/)) {
83                next;
84            }
85            split($0, chunks, ";");
86            # [unsigned int a, b, c]
87
88            for (i = 1; i in chunks; i ++) {
89                if (chunks[i] == "") {
90                    delete chunks[i];
91                    continue;
92                }
93                split(chunks[i], pieces, " ");
94                # [unsigned, int, a]
95                # [b]
96                # [c]
97
98                last_piece = "";
99                for (j = 1; j in pieces; j ++) {
100                    last_piece = pieces[j];
101                    delete pieces[j];
102                }
103                if (last_piece == "") {
104                    print "=====" chunks[i];
105                }
106                # a
107                # b
108                # c
109
110                buffer[buffer_len] = last_piece;
111                buffer_len ++;
112                delete chunks[i]
113            }
114            last_piece = "";
115        }
116        next;
117    }
118}
119
120/^typedef struct [^{]*;/ {
121    sub(";", "");
122    typedefs[$3] = $4;
123    next;
124}
125/^typedef struct .*\{/ {
126    brace = 1;
127    instruct = 1;
128    next;
129}
130
131/^struct .*\{/ {
132    instruct = $2;
133    brace = 1;
134    next;
135}
Note: See TracBrowser for help on using the repository browser.