Category : Files from Magazines
Archive   : DDJ-9008.ZIP
Filename : BALDWIN.LST

 
Output of file : BALDWIN.LST contained in archive : DDJ-9008.ZIP
_AWK AS A C CODE GENERATOR_
by Wahhab Baldwin

[LISTING ONE]

# This program reads a C structure and produces C code
# to write the record to a C-ISAM work area.
# There are limitations on the input format: see sample

BEGIN { FS = "[ \t[]+" # Override default
} # field separators
$1 == "struct" && $3 == "{" { # Opening record struct
rec = $2
print "/* " $2 " */"
offset = 0
}
$2 == "struct" && $3 == "{" { # Struct within record
type = "struct"
j = 0
}
$2 == "long" { f(type == "struct", "stlong", $3, 4)}
$2 == "int" { f(type == "struct", "stint", $3, 2)}
$2 == "float" { f(type == "struct", "stfloat", $3, 4)}
$2 == "double" { f(type == "struct", "stdbl", $3, 8)}
$2 == "char" && NF > 3 { # String
f(type == "struct", "stchar", $3, $4 - 1)}
$2 == "char" && NF == 3 { # Single character
f(type == "struct", "stchar", $3, 1)}
$2 == "}" && NF > 3 { # Array of structs
type = ""
print "\tfor (i = 0; i < " $4 + 0 "; i++) {"
for (k = 0; k < j; k++) {
gsub(";", "", name[k])
temp = $3 "[i]." name[k]
emit2("\t" stype[k], temp, flen[k])
}
print "\t}"
offset += ($4 - 1) * slen
slen = 0
}

$2 == "}" && NF == 3 { # Named struct
type = ""
for (k = 0; k < j; k++)
emit(stype[k], $3 "." name[k], flen[k])
slen = 0
}

function f(bool, str, x, y) {
if (bool)
setup(str, x, y)
else
emit(str, x, y)
}

function setup(type, varname, l) { # Save field data in array
name[j] = varname
stype[j] = type
flen[j++] = l
slen += l
}

function emit(type, varname, l) { # Print C code for field
gsub(";", "", varname)
print "\t" type "(p." rec "->" varname,
", inf_rec + " offset \
(type == "ststring" ? ", " l ");" : ");")
offset += l
}

function emit2(type, varname, l) { # Print C code for field in struct
gsub(";", "", varname)
print "\t" type "(p." rec "->" varname,
", inf_rec + i * " slen, "+",
offset (type ~ /string/ ? ", " l ");": ");")
offset += l
}

[Example 1: Simple AWK program to total a series of numbers]

{total += $1}
END {print total} # Total for all input


[Example 2: Built-in AWK function for global substitution]

{gsub(/aluminium/, "aluminum")}
{gsub(/colour/, "color")}

[Example 3: Using strings rather than integers as array subscripts]


# Program to count word usage in input.
# eliminate all non-letters except space
{ gsub(/[^A-Za-z ]/, "") }

# add words to associative array
{ for (i = 1; i <= NF; i++)
++word[$i] }

# print each array entry
END { for (j in word)
print j, word[j] }

[Example 4: Alternative to using the ? operator]

if (type ~ /string/)
last_part = ", " l ");"
else
last_part = ");"
print "\t" type "(p." rec "->" varname
", inf_rec + " offset last_part





  3 Responses to “Category : Files from Magazines
Archive   : DDJ-9008.ZIP
Filename : BALDWIN.LST

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/