#! /bin/sh KEYGEN=$(mktemp) trap "rm -f $KEYGEN; exit 1" 1 2 3 15 cat > $KEYGEN <0) keywords[kw]++ } /^@begin code/ { printf "@literal \\begin{code}{%s}\\let\\maybehbox=\\hbox\n", substr($0, 13) code=1; next } /^@end code/ { code=0 ; printf "@literal \\end{code}\n"; next} /^@quote$/ { quoting = 1 } /^@endquote$/ { quoting = 0 } /^@text / { if (code) { print_code(substr($0, 7)) } else { print } next } {print} function print_code(line) { temp = line; comm = ""; if (temp ~ /\/\*/) { r = index(temp, "/*"); inside_comm = 1; comm = "\\COMMENT{" substr(temp, r+3); if (comm ~ /\*\//) { inside_comm = 0; comm = comm "}"; temp = ""; } } if (temp ~ /\*\//) { comm = temp "}"; temp = ""; inside_comm = 0; } sub(/\*\//,"",comm); sub(/\/\*.*/,"",temp); if (temp != "" && inside_comm == 0) { temp = operators(temp); temp = substitute_keywords(temp); temp = mark_vars_types(temp); } line = temp comm; print "@literal " line; } function substitute_keywords(s, kw) { for (kw in keywords) if (s ~ kw) { gsub("(^|[ \\t]+)" kw "($|[ \\t]+)", " \\" kw " ", s); gsub("(^|[ \\t]+)" kw ";", " \\" kw ";", s); gsub("(^|[ \\t]+)" kw "\\.", " \\" kw ".", s); gsub("[(]" kw, "(\\" kw, s); gsub("," kw, ",\\" kw, s); } return s } function mark_vars_types(s ) { gsub(/\\OF[ \t\n]*[a-zA-Z_]+/,"|&|", s); gsub(/\\RETURN[ \t\n]*[a-zA-Z_]+/,"|&|", s); gsub(/[a-zA-Z_]+[ \t\n]*=[ \t\n](\\RECORD|\\ARRAY)/,"|&|", s); gsub(/[a-zA-Z_]+[ \t\n]*=[ \t\n]\\{/,"|&|",s); gsub(/:[\t\n ]*[a-zA-Z_]+/, "|&|" ,s); gsub(/[a-zA-Z_]+[ \\t\\n]*\(/,"|&|",s); gsub(/\(\|/, "|(", s); gsub(/\|:[ \t\n]*/, ":|", s); gsub(/\|\\de[ \t\n]*/, "\\de |", s); gsub(/\|\\RETURN[ \t\n]*/, "\\RETURN |", s); gsub(/\=[\t\n ]*\\ARRAY\|/, "| = \\ARRAY", s); gsub(/\=[\t\n ]*\\RECORD\|/, "| = \\RECORD", s); gsub(/\=[\t\n ]*\\{\|/, "| = \\{", s); return s } function operators(s ) { gsub(/ >= /," \\ge ", s); gsub(/ <= /, " \\le ", s); gsub(/ != /, " \\not= ", s); return s; } ' "$@" rm -f $KEYGEN