riddle@woton.UUCP (06/19/87)
# sh archive - cd to a suitable directory and run this through sh # # built on Thu Jun 18 16:30:20 CDT 1987 by woton!riddle # echo README cat > README <<"%RoNnIe%RaYgUn%" The following are two awk scripts which might be of interest to some of you. They convert an Informix schema into the C structures needed for interfacing with ALL-II routines. The Makefile formalizing the relationship would look something like this: test.c: test.sch awk -f $(BINDIR)/dbrec.awk test.sch > test.c test.h: test.sch awk -f $(BINDIR)/dbview.awk test.sch > test.h prog: prog.c test.c test.h cc -f -g -O prog.c -ldb -lm -o prog The program "prog.c" contains "#include" lines for "test.h" and "test.c". See the awk scripts themselves for sample input and output. Caveats: these scripts aren't extremely smart, and in particular they can be confused by comments (I get around this by beginning each comment line between the "{" and "}" with a "#"). If someone would like to take this idea and turn it into an idiot-proof C program, I would be delighted. --- Prentiss Riddle ("Aprendiz de todo, maestro de nada.") --- Opinions expressed are not necessarily those of Shriners Burns Institute. --- riddle@woton.UUCP {ihnp4,harvard,seismo}!ut-sally!im4u!woton!riddle %RoNnIe%RaYgUn% # echo dbrec.awk cat > dbrec.awk <<"%RoNnIe%RaYgUn%" #! /bin/awk # # dbrec.awk -- awk script to convert an Informix schema into # a C record structure # # Usage: awk -f dbrec.awk foo.sch > foo.c # # Diagnostics are produced as comments within the C output. # # NOTE: schema keywords must be in lower case. # # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # Author: Prentiss Riddle # Shriners Burns Institute # 610 Texas Ave. # Galveston, TX 77550 USA # (409)-761-4701 # UUCP address: ihnp4!ut-sally!im4u!woton!riddle # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # # History: # 86.11.26 riddle Original version. # 86.12.11 riddle Modified to ignore composite variables. # 86.12.12 riddle Added section to handle end of file even # without "end" or "permissions" statement. # 87.02.05 riddle Added "edate" and "ydate" field types. # 87.02.06 riddle Added "FILE_struct" definition. # #==================================================================== # Sample input: # # database dummy # # file test # # field f1 type character length 3 index # field f2 type char 3 # field f3 type date # field f4 type double # field f5 type float # field f6 type int # field f7 type integer # field f8 type long # field f9 type money # field f10 type serial # # permissions # # file user riddle access all # file public access read # # end # # Sample output: # # /* c record structure based on Informix schema # * automagically produced using dbrec.awk # */ # /* Informix database: dummy */ # /* Informix file: test */ # struct test_struct # { # char f1 [ 4 ]; # char f2 [ 4 ]; # long f3 ; /* Informix type "date" */ # double f4 ; # float f5 ; # int f6 ; # int f7 ; # long f8 ; # double f9 ; /* Informix type "money" */ # long f10 ; /* Informix type "serial" */ # }; # struct test_struct test_rec; # #ifdef NF_test # #if NF_test != 10 # fprintf(stderr, "compile problem in test_rec: NF_test != 10\n"); # exit(-1); # #endif # #endif # #==================================================================== BEGIN { print "/* c record structure based on Informix schema" print " * automagically produced using dbrec.awk" print " */" NFIELDS = 0 } /^[ ]*database[ ]/ { if (DATABASE != "") { print "/* ERROR - database redefinition:" print " * ", $0 print " */" exit } DATABASE = $2 print "/* Informix database:", DATABASE, " */" } /^[ ]*file[ ]/ { if (FILE != "") { print "/* ERROR - file redefinition:" print " * ", $0 print " */" exit } FILE = $2 print "/* Informix file: ", FILE, " */" printf "struct %s_struct\n", FILE print "{" } /^[ ]*field[ ]/ { NFIELDS++; if ($4 == "char" || $4 == "character") { if ($5 == "len" || $5 == "length") { LEN = $6 + 1 } else { # ## "length" keyword omitted LEN = $5 + 1 } print "char ", $2, "[", LEN, "];" } else if ($4 == "composite") { print "/* Composite field ignored:" print " * ", $0 print " */" NFIELDS--; } else if ($4 == "date") { print "long ", $2, "; /* Informix type \"date\" */" } else if ($4 == "double") { print "double", $2, ";" } else if ($4 == "edate") { print "long ", $2, "; /* Informix type \"edate\" */" } else if ($4 == "float") { print "float ", $2, ";" } else if ($4 == "int" || $4 == "integer") { print "int ", $2, ";" } else if ($4 == "long") { print "long ", $2, ";" } else if ($4 == "money") { print "double", $2, "; /* Informix type \"money\" */" } else if ($4 == "serial") { print "long ", $2, "; /* Informix type \"serial\" */" } else if ($4 == "ydate") { print "long ", $2, "; /* Informix type \"ydate\" */" } else { print "/* Unrecognized field statement:" print " * ", $0 print " */" NFIELDS--; } } /^[ ]*end[ ]/ || /^[ ]*permissions[ ]*$/ { exit } END { printf "};\n" printf "struct %s_struct %s_rec;\n", FILE, FILE # # The following generates c pre-processor code to check that the # # number of fields processed by dbrec.awk and dbview.awk are # # in agreement. printf "#ifdef NF_%s\n", FILE printf "#if NF_%s != %d\n", FILE, NFIELDS printf "\tfprintf(stderr, \"compile problem in %s_rec: NF_%s != %d\\n\");\n", FILE, FILE, NFIELDS printf "\texit(-1);\n" printf "#endif\n" printf "#endif\n" } %RoNnIe%RaYgUn% # echo dbview.awk cat > dbview.awk <<"%RoNnIe%RaYgUn%" #! /bin/awk # # dbview.awk -- awk script to convert an Informix schema into # a C "dbview" structure # # Usage: awk -f dbview.awk foo.sch > foo.h # # Diagnostics are produced as comments within the C output. # # NOTE: schema keywords must be in lower case. # # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # Author: Prentiss Riddle # Shriners Burns Institute # 610 Texas Ave. # Galveston, TX 77550 USA # (409)-761-4701 # UUCP address: ihnp4!ut-sally!im4u!woton!riddle # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # # History: # 86.11.26 riddle Original version. # 86.12.11 riddle Modified to ignore composite keys. # 86.12.12 riddle Modified to keep track of whether or not a comma is # needed between fields (this is to avoid getting a # spurious extra comma before the final "};"). # Added section to handle end of file even in case # of missing "end" or "permissions" statement. # Added NFIELDS definition. # #============================================================================ # Sample input: # # database dummy # # file test # # field f1 type character length 3 index # field f2 type char 3 # field f3 type date # field f4 type double # field f5 type float # field f6 type int # field f7 type integer # field f8 type long # field f9 type money # field f10 type serial # # permissions # # file user riddle access all # file public access read # # end # # Sample output: # # /* c "dbview" structure based on Informix schema # * automagically produced using dbview.awk # */ # /* Informix database: dummy */ # /* Informix file: test */ # struct dbview test_list[]= # { # {"f1"}, # {"f2"}, # {"f3"}, # {"f4"}, # {"f5"}, # {"f6"}, # {"f7"}, # {"f8"}, # {"f9"}, # {"f10"} # }; # #define NF_test 10 /* no. of fields in test_list */ # #==================================================================== BEGIN { print "/* c \"dbview\" structure based on Informix schema" print " * automagically produced using dbview.awk" print " */" NEEDCOMMA = 0 NFIELDS = 0 } /^[ ]*database[ ]/ { if (DATABASE != "") { print "/* ERROR - database redefinition:" print " * ", $0 print " */" exit } DATABASE = $2 print "/* Informix database:", DATABASE, " */" } /^[ ]*file[ ]/ { if (FILE != "") { print "/* ERROR - file redefinition:" print " * ", $0 print " */" exit } FILE = $2 print "/* Informix file: ", FILE, " */" printf "struct dbview %s_list[]=\n", FILE print "{" } /^[ ]*field[ ]/ { if (NEEDCOMMA == 1) { # # print comma separator between fields printf ",\n" } if ($4 != "composite") { printf "{\"%s\"}", $2 NEEDCOMMA = 1 NFIELDS++ } else { print "/* Composite field ignored:" print " * ", $0 print " */" NEEDCOMMA = 0 } } /^[ ]*end[ ]/ || /^[ ]*permissions[ ]*$/ { exit } END { printf "\n};\n" printf "#define NF_%s\t%d\t/* no. of fields in %s_list */\n", FILE, NFIELDS, FILE } %RoNnIe%RaYgUn% # wc README dbrec.awk dbview.awk echo total should be: 337 1544 8528 total # end of sh archive