home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1990 / 08 / baldwin.lst < prev    next >
File List  |  1990-06-20  |  4KB  |  116 lines

  1. _AWK AS A C CODE GENERATOR_
  2. by Wahhab Baldwin
  3.  
  4. [LISTING ONE]
  5.  
  6. #    This program reads a C structure and produces C code
  7. #    to write the record to a C-ISAM work area.
  8. #    There are limitations on the input format:  see sample
  9.  
  10. BEGIN {     FS = "[ \t[]+"              # Override default
  11.       }                                 #    field separators
  12. $1 == "struct" && $3 == "{" {           # Opening record struct
  13.             rec = $2
  14.             print "/*  " $2 "  */"
  15.             offset = 0
  16.        }
  17. $2 == "struct" && $3 == "{" {           # Struct within record
  18.             type = "struct"
  19.             j = 0
  20.        }
  21. $2 == "long"   {    f(type == "struct", "stlong",  $3, 4)}
  22. $2 == "int"    {    f(type == "struct", "stint",   $3, 2)}
  23. $2 == "float"  {    f(type == "struct", "stfloat", $3, 4)}
  24. $2 == "double" {    f(type == "struct", "stdbl",   $3, 8)}
  25. $2 == "char" && NF > 3 {                # String
  26.                     f(type == "struct", "stchar",  $3, $4 - 1)}
  27. $2 == "char" && NF == 3 {               # Single character
  28.                     f(type == "struct", "stchar",  $3, 1)}
  29. $2 == "}" && NF > 3 {                   # Array of structs
  30.             type = ""
  31.             print "\tfor (i = 0; i < " $4 + 0 "; i++) {"
  32.             for (k = 0; k < j; k++) {
  33.                 gsub(";", "", name[k])
  34.                 temp = $3 "[i]." name[k]
  35.                 emit2("\t" stype[k], temp, flen[k])
  36.             }
  37.             print "\t}"
  38.             offset += ($4 - 1) * slen
  39.             slen = 0
  40.         }
  41.  
  42. $2 == "}" && NF == 3 {                  # Named struct
  43.             type = ""
  44.             for (k = 0; k < j; k++)
  45.                 emit(stype[k], $3 "." name[k], flen[k])
  46.             slen = 0
  47.         }
  48.  
  49. function f(bool, str, x, y) {
  50.            if (bool)
  51.                 setup(str, x, y)
  52.             else
  53.                 emit(str, x, y)
  54.         }
  55.  
  56. function setup(type, varname, l) {      # Save field data in array
  57.             name[j] = varname
  58.             stype[j] = type
  59.             flen[j++] = l
  60.             slen += l
  61.         }
  62.  
  63. function emit(type, varname, l) {       # Print C code for field
  64.             gsub(";", "", varname)
  65.             print "\t" type "(p." rec "->" varname,
  66.                 ", inf_rec + " offset \
  67.                 (type == "ststring" ? ", " l ");" : ");")
  68.             offset += l
  69.         }
  70.  
  71. function emit2(type, varname, l) {      # Print C code for field in struct
  72.             gsub(";", "", varname)
  73.             print "\t" type "(p." rec "->" varname,
  74.                 ", inf_rec + i * " slen, "+",
  75.                 offset (type ~ /string/ ? ", " l ");": ");")
  76.             offset += l
  77.         }
  78.  
  79. [Example 1: Simple AWK program to total a series of numbers]
  80.  
  81. {total += $1}
  82. END  {print total}  # Total for all input
  83.  
  84.  
  85. [Example 2:  Built-in AWK function for global substitution]
  86.  
  87.     {gsub(/aluminium/, "aluminum")}
  88.     {gsub(/colour/, "color")}
  89.  
  90. [Example 3:  Using strings rather than integers as array subscripts]
  91.  
  92.  
  93.            # Program to count word usage in input.
  94.            # eliminate all non-letters except space
  95.            {    gsub(/[^A-Za-z ]/, "")        }
  96.  
  97.            # add words to associative array
  98.            {    for (i = 1; i <= NF; i++)
  99.                      ++word[$i] }
  100.  
  101.            # print each array entry
  102.       END  {    for (j in word)
  103.                      print j, word[j] }
  104.  
  105. [Example 4:  Alternative to using the ? operator]
  106.  
  107.       if (type ~ /string/)
  108.            last_part = ", " l ");"
  109.       else
  110.            last_part = ");"
  111.       print "\t" type "(p." rec "->" varname
  112.            ", inf_rec + " offset last_part
  113.  
  114.  
  115.  
  116.