73 lines
2.6 KiB
Awk
73 lines
2.6 KiB
Awk
|
#################################################################
|
||
|
# #
|
||
|
# Copyright 2002, 2004 Sanchez Computer Associates, Inc. #
|
||
|
# #
|
||
|
# This source code contains the intellectual property #
|
||
|
# of its copyright holder(s), and is made available #
|
||
|
# under a license. If you do not know the terms of #
|
||
|
# the license, please stop and do not read further. #
|
||
|
# #
|
||
|
#################################################################
|
||
|
BEGIN {
|
||
|
curlyparenlevel = 0;
|
||
|
squareparenlevel = 0;
|
||
|
prevfield = "";
|
||
|
fieldcount = 0;
|
||
|
}
|
||
|
{
|
||
|
input = $0;
|
||
|
gsub("\\[.*\\]", " ");
|
||
|
gsub("\".*\"", " ");
|
||
|
gsub("'.*'", " ");
|
||
|
gsub("\\[", " & "); # telecaster's awk doesn't allow for putting [ within a [] block hence this is separate from the following line
|
||
|
gsub("\\]", " & ");
|
||
|
gsub("[#;,{}=*]", " & ");
|
||
|
if ($1 != "")
|
||
|
{
|
||
|
for (i = 1; i <= NF; i++)
|
||
|
{
|
||
|
if ($i == "{")
|
||
|
{
|
||
|
if (curlyparenlevel == 0 && squareparenlevel == 0 && prevfield == c_struct)
|
||
|
{
|
||
|
found_struct=1;
|
||
|
gsub(c_struct,c_struct"_type",input);
|
||
|
}
|
||
|
curlyparenlevel++;
|
||
|
if (curlyparenlevel == 1 && squareparenlevel == 0)
|
||
|
fieldcount = 0;
|
||
|
} else if ($i == "}")
|
||
|
curlyparenlevel--;
|
||
|
else if ($i == "[")
|
||
|
squareparenlevel++;
|
||
|
else if ($i == "]")
|
||
|
squareparenlevel--;
|
||
|
else if ($i == ";" || $i == ",")
|
||
|
{
|
||
|
if (squareparenlevel == 0 && curlyparenlevel == 1 && prevfield !~ /^[0-9][0-9]*$/)
|
||
|
structarray[fieldcount++] = prevfield;
|
||
|
else if ((curlyparenlevel == 0 && squareparenlevel == 0) && (prevfield == c_struct || found_struct))
|
||
|
{
|
||
|
for (j = 1; j <= i; j++)
|
||
|
printf "%s ", $j;
|
||
|
if (found_struct) printf "\ntypedef struct %s_type %s;\n",c_struct,c_struct;
|
||
|
printf "\n#undef offsetof\n#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)";
|
||
|
printf "\n#define PRINT_OFFSET(TYPE, MEMBER) printf(\"\\toffset = %%.4d [0x%%.4x] size = %%.4d [0x%%.4x] ----> \"#MEMBER\" \\n\", offsetof(TYPE,MEMBER), offsetof(TYPE,MEMBER), sizeof(temp_##TYPE.MEMBER), sizeof(temp_##TYPE.MEMBER))\n";
|
||
|
printf "\nmain()\n{\n\t%s\ttemp_%s;\n\n", c_struct, c_struct;
|
||
|
printf "\tprintf (\"\\nStructure ----> %s <---- \tsize = %%d [0x%%x] \\n\\n\", sizeof(temp_%s), sizeof(temp_%s));\n", c_struct, c_struct, c_struct;
|
||
|
for (i = 0; i < fieldcount; i++)
|
||
|
{
|
||
|
gsub(/[)(]*/,"",structarray[i]);
|
||
|
printf "\n\tPRINT_OFFSET(%s,%s);", c_struct, structarray[i];
|
||
|
}
|
||
|
printf "\n\tprintf(\"\\n\");\n}\n";
|
||
|
exit
|
||
|
}
|
||
|
}
|
||
|
if (squareparenlevel == 0 && $i != "]")
|
||
|
prevfield = $i;
|
||
|
}
|
||
|
print input;
|
||
|
}
|
||
|
}
|