BEGIN {
RS = ";";
FS = ",";
types[0] = "pstring";
types[1] = "pint";
types[2] = "punsigned";
types[3] = "pbool";
types[4] = "pfloat";
types[5] = "pdouble";
types[6] = "pdouble";
types[7] = "pcolormap";
format[0] = "%s"; zero[0] = "\"\"";
format[1] = "%d"; zero[1] = "0";
format[2] = "%d"; zero[2] = "0";
format[3] = "%d"; zero[3] = "0";
format[4] = "%f"; zero[4] = "0.";
format[5] = "%lf"; zero[5] = "0.";
format[6] = "%lf"; zero[6] = "0.";
format[7] = "%f"; zero[7] = "0.";
ORS = ""
print "// Automatically generated by params.awk\n"
print "// Automatically generated by params.awk\n" > "draw_json.h"
# print "#include \"parse.h\""
}
function print1(f, args)
{
gsub("[\"]", "\\\"", f)
print " i = snprintf (s, len, \"" f "\"" >> "draw_json.h"
if (args != "")
print ", " args >> "draw_json.h";
print ");\n" >> "draw_json.h"
print " s += i, len -= i, len1 += i;\n" >> "draw_json.h"
}
function gettype(c)
{
if (c[2] == "*") {
if (c[1] == "char")
return 0;
}
else if (c[1] == "int")
return 1;
else if (c[1] == "unsigned")
return 2;
else if (c[1] == "bool")
return 3;
else if (c[1] == "float")
return 4;
else if (c[1] == "double")
return 5;
else if (c[1] == "coord")
return 6;
else if (c[1] == "colormap")
return 7;
return -1;
}
/\([^)]*\)[\t\n ]*{/ {
if (match($0, /([a-zA-Z_]+)[\t\n ]+([a-zA-Z_]+)[\t\n ]+([a-zA-Z_0-9]+)[\t\n ]*\(([^)]*)\)[\t\n ]*{/, a) &&
a[1] == "static")
;
else if (match($0, /([a-zA-Z_]+)[\t\n ]+([a-zA-Z_0-9]+)[\t\n ]*\(([^)]*)\)[\t\n ]*{/, a) &&
a[1] != "else" && a[3] != "" && !match(a[3], /struct[ \t]+/) &&
(a[1] == "void" || a[1] == "bool")) {
rettype = a[1];
name = a[2];
params = a[3];
print "else if (!strcmp (s, \"" name "\")) {\n"
print "int _" name "_json (char * s, int len) {\n" >> "draw_json.h"
print " int i, len1 = 0;\n" >> "draw_json.h"
print1(" \"" name "\" : {", "");
nc = "\\n"
n = split (params, b, ",[ \t\n]");
for (i = 1; i <= n; i++) {
gsub(/^[ \t\n]+/, "", b[i]);
gsub(/[ \t\n]+$/, "", b[i])
print " " b[i];
if (!match(b[i], /=/)) {
split (b[i], c, "[ \n\t]+");
type = gettype(c);
if (type == 0)
print " = NULL";
else if (type > 0)
print " = " zero[type];
}
print ";\n";
}
print " Params params[] = {\n"
for (i = 1; i <= n; i++) {
nf = split (b[i], c, "[ \n\t]+");
type = gettype(c);
pos = c[2] == "*" ? 3 : 2;
param[i] = c[pos];
gsub ("\\[.*\\]", "", param[i])
if (type >= 0) {
d = "";
for (j = pos; j <= nf && c[j] != "="; j++)
d = d c[j];
split (d, e, ",|;");
for (j in e) {
if (e[j] != "" && e[j] != "expr" && substr (e[j],1,1) != "/") {
if (gsub ("[\\[\\]]", " ", e[j])) {
split (e[j], f, " ");
print " {\"" f[1] "\", " types[type] ", " f[1] ", " f[2] "},\n";
tname = f[1] == "fc" || f[1] == "lc" ? "color" : types[type];
s = nc " \"" f[1] "\": { \"type\": \"" tname \
"\", \"cardinality\": " f[2] ", \"value\": [" format[type];
for (k = 1; k < f[2]; k++)
s = s "," format[type];
s = s "] }";
s1 = zero[type]; # f[1] "[0]";
for (k = 1; k < f[2]; k++)
s1 = s1 ", " zero[type]; # f[1] "[" k "]";
print1(s, s1);
}
else if (type == 6) {
print " {\"" e[j] "\", " types[type] ", &" e[j] ", 3},\n";
print1(nc " \"" e[j] "\": { \"type\": \"" types[type] \
"\", \"cardinality\": 3, \"value\": [%lf,%lf,%lf] }",
zero[type] ", " zero[type] ", " zero[type]);
# e[j] ".x, " e[j] ".y, " e[j] ".z");
}
else {
print " {\"" e[j] "\", " types[type] ", &" e[j] "},\n";
if (type != 7) # colormap: fixme: does nothing for the moment
print1(nc " \"" e[j] "\": { \"type\": \"" types[type] \
"\", \"cardinality\": 1, \"value\": \"" format[type] "\" }", zero[type]); # e[j]);
}
nc = ",\\n";
}
}
}
}
print " {NULL}\n };\n"
print " if (!parse_params (params))\n"
print " return false;\n"
printf " ";
if (rettype == "bool")
printf "if (!";
printf name " (";
for (i = 1; i <= n; i++) {
printf param[i];
if (i < n)
printf (",");
}
if (rettype == "bool") {
print "))\n"
print " return false;\n"
}
else
print ");\n"
print "}\n"
print1("\\n }");
print " return len1;\n" >> "draw_json.h"
print "}\n" >> "draw_json.h"
}
}