source: trunk/mkstructinfo.awk @ 23

Last change on this file since 23 was 23, checked in by moo, 9 years ago

POSIX { and delete
TODO: still not POSIX compatible due to "match()"

File size: 1.5 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        elm = "";
17        elms = "";
18        for (i = 0; i in buffer; i ++) {
19            if (i) elm = elm " + ";
20            # elm = elm "sizeof(((`" instruct "'*)NULL)->`" buffer[i] "')";
21            # elms = elms " `" buffer[i] "'";
22            elm = elm "sizeof(((" instruct "*)NULL)->" buffer[i] ")";
23
24            if (elms == "") {
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, elm;
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(/\[[^\]]+\]/, "");
55        gsub(/:[0-9]+/, "");
56        str = $0;
57        if (match(str, /\([ ]*\*([^)]+)\)/, a)) {
58            buffer[buffer_len] = a[1];
59            buffer_len ++;
60        }
61        else {
62            while (gsub(/(\([^)]*\))/, "", str)) {
63            }
64            while (match(str, /([^*() ]+)[ ]*[,;](.*)/, a)) {
65                buffer[buffer_len] = a[1];
66                buffer_len ++;
67                str = a[2];
68            }
69        }
70        next;
71    }
72}
73
74/^typedef struct [^{]*;/ {
75    sub(";", "");
76    typedefs[$3] = $4;
77    next;
78}
79/^typedef struct .*\{/ {
80    brace = 1;
81    instruct = 1;
82    next;
83}
84
85/^struct .*\{/ {
86    instruct = $2;
87    brace = 1;
88    next;
89}
Note: See TracBrowser for help on using the repository browser.