fis-gtm/sr_unix/offset.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;
}
}