You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
3.8 KiB
Awk
213 lines
3.8 KiB
Awk
![]()
17 years ago
|
#! /usr/bin/awk -f
|
||
![]()
17 years ago
|
# vim:ts=4:sw=4
|
||
|
BEGIN {
|
||
|
brace = 0;
|
||
![]()
17 years ago
|
incomment = 0;
|
||
![]()
17 years ago
|
buffer_len = 0;
|
||
|
}
|
||
![]()
11 years ago
|
function printstruct(structname) {
|
||
|
printf "define(`ELEMENTSOF_%s', `%s')\n", structname, ELEMENTSOF[structname];
|
||
|
printf "define(`COUNTOF_%s', `%s')\n", structname, COUNTOF[structname];
|
||
|
printf "define(`SIZEOF_%s', `( %s )')\n", structname, SIZEOF[structname];
|
||
|
}
|
||
![]()
11 years ago
|
function countBrace(text, len, i, char, braceCount) {
|
||
|
len = length(text);
|
||
|
braceCount = 0;
|
||
|
for (i = 1; i <= len; ++i) {
|
||
|
char = substr(text, i, 1);
|
||
|
if (char == "{") {
|
||
|
braceCount = braceCount + 1;
|
||
|
}
|
||
|
else if (char == "}") {
|
||
|
braceCount = braceCount - 1;
|
||
|
}
|
||
|
}
|
||
|
return braceCount;
|
||
|
}
|
||
![]()
17 years ago
|
|
||
|
# multiline comment handling
|
||
|
{
|
||
|
# removes one line comment
|
||
|
gsub(/\/\*(.+?)\*\//, " ");
|
||
|
}
|
||
|
/\*\// {
|
||
|
if (incomment) {
|
||
|
sub(/.*\*\//, "");
|
||
|
incomment = 0;
|
||
|
}
|
||
|
}
|
||
|
incomment {
|
||
|
next;
|
||
|
}
|
||
|
/\/\*/ {
|
||
|
sub(/\/\*.*/, "");
|
||
|
incomment = 1;
|
||
|
# fall through
|
||
|
}
|
||
|
|
||
|
# skip file/line mark here to be faster
|
||
![]()
17 years ago
|
/^#/ {
|
||
|
next;
|
||
|
}
|
||
![]()
17 years ago
|
|
||
![]()
17 years ago
|
/^}.*;/ {
|
||
|
if (instruct) {
|
||
|
sub(";", "");
|
||
![]()
11 years ago
|
structname = instruct;
|
||
|
if (structname == 1 && $2) {
|
||
|
structname = $2;
|
||
![]()
17 years ago
|
}
|
||
![]()
11 years ago
|
if (structname in typedefs) {
|
||
|
structname = typedefs[structname];
|
||
![]()
17 years ago
|
}
|
||
![]()
17 years ago
|
sizeinfo = "";
|
||
![]()
17 years ago
|
elms = "";
|
||
|
for (i = 0; i in buffer; i ++) {
|
||
![]()
17 years ago
|
if (i) {
|
||
|
sizeinfo = sizeinfo " + ";
|
||
|
}
|
||
![]()
11 years ago
|
sizeinfo = sizeinfo "sizeof(((" structname "*)NULL)->" buffer[i] ")";
|
||
![]()
17 years ago
|
|
||
![]()
17 years ago
|
if (i == 0) {
|
||
![]()
12 years ago
|
elms = "\"" buffer[i] "\"";
|
||
![]()
17 years ago
|
}
|
||
|
else {
|
||
![]()
12 years ago
|
elms = elms "," "\"" buffer[i] "\"";
|
||
![]()
17 years ago
|
}
|
||
![]()
17 years ago
|
}
|
||
![]()
11 years ago
|
ELEMENTSOF[structname] = elms;
|
||
|
COUNTOF[structname] = i;
|
||
|
SIZEOF[structname] = sizeinfo;
|
||
|
printstruct(structname);
|
||
![]()
17 years ago
|
print "\n";
|
||
![]()
17 years ago
|
for (i in buffer) {
|
||
|
delete buffer[i];
|
||
|
}
|
||
![]()
17 years ago
|
buffer_len = 0;
|
||
|
instruct = 0;
|
||
|
}
|
||
|
next;
|
||
|
}
|
||
|
|
||
![]()
11 years ago
|
/.[{}]/ {
|
||
|
brace += countBrace($0);
|
||
![]()
17 years ago
|
}
|
||
|
|
||
|
{
|
||
|
if (brace == 1 && instruct) {
|
||
![]()
17 years ago
|
gsub(/(^[\t ]+|[\t ]+$)/, ""); # trim whitespaces
|
||
![]()
17 years ago
|
sub(/.*[{}]/, "");
|
||
![]()
17 years ago
|
gsub(/\[[^\]]+\]/, ""); # ignore [...]
|
||
|
gsub(/:[0-9]+/, ""); # ignore struct bit
|
||
|
if (match($0, /^[^(]*\([ ]*\*([^)]+)\)/)) {
|
||
|
sub(/ +/, "")
|
||
|
sub(/^[^(]*\(\*/, "");
|
||
|
sub(/\).*/, "");
|
||
|
# function pointer
|
||
|
buffer[buffer_len] = $0;
|
||
![]()
17 years ago
|
buffer_len ++;
|
||
|
}
|
||
|
else {
|
||
![]()
17 years ago
|
# process normal variables
|
||
|
|
||
![]()
17 years ago
|
# ignore any ()s
|
||
|
while (gsub(/(\([^)]*\))/, "")) {
|
||
|
}
|
||
|
if (match($0, /[()]/)) {
|
||
|
next;
|
||
![]()
17 years ago
|
}
|
||
![]()
17 years ago
|
# unsigned int *a, b; int c;
|
||
![]()
17 years ago
|
gsub(/[*]/, " ");
|
||
![]()
17 years ago
|
# unsigned int a, b; int c;
|
||
![]()
17 years ago
|
gsub(/ +/, " ");
|
||
![]()
17 years ago
|
# unsigned int a, b; int c;
|
||
![]()
17 years ago
|
gsub(/ *[,;]/, ";");
|
||
![]()
17 years ago
|
# unsigned int a; b; int c;
|
||
![]()
17 years ago
|
if (!match($0, /;/)) {
|
||
|
next;
|
||
|
}
|
||
![]()
17 years ago
|
# print "=DEBUG=" $0 "==";
|
||
![]()
17 years ago
|
split($0, chunks, ";");
|
||
![]()
17 years ago
|
# [unsigned int a, b, c]
|
||
|
|
||
|
for (i = 1; i in chunks; i ++) {
|
||
![]()
17 years ago
|
if (chunks[i] == "") {
|
||
|
delete chunks[i];
|
||
|
continue;
|
||
|
}
|
||
|
split(chunks[i], pieces, " ");
|
||
![]()
17 years ago
|
# [unsigned, int, a]
|
||
|
# [b]
|
||
|
# [c]
|
||
![]()
17 years ago
|
|
||
![]()
17 years ago
|
last_piece = "";
|
||
|
for (j = 1; j in pieces; j ++) {
|
||
![]()
17 years ago
|
last_piece = pieces[j];
|
||
![]()
17 years ago
|
delete pieces[j];
|
||
![]()
17 years ago
|
}
|
||
|
if (last_piece == "") {
|
||
![]()
17 years ago
|
# print "=ERROR=" chunks[i] "==";
|
||
|
delete chunks[i];
|
||
|
continue;
|
||
![]()
17 years ago
|
}
|
||
![]()
17 years ago
|
# a
|
||
|
# b
|
||
|
# c
|
||
|
|
||
![]()
17 years ago
|
buffer[buffer_len] = last_piece;
|
||
![]()
17 years ago
|
buffer_len ++;
|
||
![]()
17 years ago
|
delete chunks[i]
|
||
![]()
17 years ago
|
}
|
||
![]()
17 years ago
|
last_piece = "";
|
||
![]()
17 years ago
|
}
|
||
|
next;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/^typedef struct [^{]*;/ {
|
||
|
sub(";", "");
|
||
![]()
11 years ago
|
typename=$3;
|
||
|
newtypename=$4;
|
||
|
typedefs[typename] = newtypename;
|
||
|
if (ELEMENTSOF[typename]) {
|
||
|
ELEMENTSOF[newtypename] = ELEMENTSOF[typename];
|
||
|
COUNTOF[newtypename] = COUNTOF[typename];
|
||
|
sub(/.*/, SIZEOF[typename]);
|
||
|
gsub(typename, newtypename);
|
||
|
SIZEOF[newtypename] = $0;
|
||
|
printstruct(newtypename);
|
||
|
}
|
||
![]()
17 years ago
|
next;
|
||
|
}
|
||
![]()
17 years ago
|
/^typedef struct .*\{[^}]*$/ {
|
||
![]()
11 years ago
|
brace = countBrace($0);
|
||
|
if (brace > 0) {
|
||
|
instruct = 1;
|
||
|
}
|
||
|
else {
|
||
|
brace = 0;
|
||
|
instruct = 0;
|
||
|
}
|
||
|
|
||
|
for (i in buffer) {
|
||
|
delete buffer[i];
|
||
|
}
|
||
![]()
17 years ago
|
next;
|
||
|
}
|
||
|
|
||
![]()
11 years ago
|
/^struct .*\{.*/ {
|
||
|
brace = countBrace($0);
|
||
|
if (brace > 0) {
|
||
|
instruct = $2;
|
||
|
}
|
||
|
else {
|
||
|
brace = 0;
|
||
|
instruct = 0;
|
||
|
}
|
||
|
|
||
|
for (i in buffer) {
|
||
|
delete buffer[i];
|
||
|
}
|
||
![]()
17 years ago
|
next;
|
||
|
}
|