source: trunk/mkstructinfo.awk @ 52

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

bc with old bsd for devel

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