softcore.awk revision 68729
118616Sfenner#!/usr/bin/awk -f 218616Sfenner# 318616Sfenner# Convert forth source files to a giant C string 418616Sfenner# 518616Sfenner# Joe Abley <jabley@patho.gen.nz>, 12 January 1999 618616Sfenner# 718616Sfenner# 02-oct-1999: Cleaned up awk slightly; added some additional logic 818616Sfenner# suggested by dcs to compress the stored forth program. 918616Sfenner# 1018616Sfenner# Note! This script uses strftime() which is a gawk-ism, and the 1118616Sfenner# POSIX [[:space:]] character class. 1218616Sfenner# 1318616Sfenner# $FreeBSD: head/sys/boot/ficl/softwords/softcore.awk 68729 2000-11-14 21:02:49Z obrien $ 1418616Sfenner 1518616SfennerBEGIN \ 1618616Sfenner{ 1718616Sfenner printf "/***************************************************************\n"; 1818616Sfenner printf "** s o f t c o r e . c\n"; 1918616Sfenner printf "** Forth Inspired Command Language -\n"; 2018616Sfenner printf "** Words from CORE set written in FICL\n"; 2118616Sfenner printf "** Author: John Sadler (john_sadler@alum.mit.edu)\n"; 2218616Sfenner printf "** Created: 27 December 1997\n"; 2318616Sfenner printf "** Last update: %s\n", datestamp; 2418616Sfenner printf "***************************************************************/\n"; 2518616Sfenner printf "\n/*\n"; 2618616Sfenner printf "** This file contains definitions that are compiled into the\n"; 2718616Sfenner printf "** system dictionary by the first virtual machine to be created.\n"; 2818616Sfenner printf "** Created automagically by ficl/softwords/softcore.awk\n"; 2918616Sfenner printf "*/\n"; 3018616Sfenner printf "\n#include \"ficl.h\"\n"; 3118616Sfenner printf "\nstatic char softWords[] =\n"; 32 33 commenting = 0; 34} 35 36# some general early substitutions 37{ 38 gsub(/\t/, " "); # replace each tab with 4 spaces 39 gsub(/\"/, "\\\""); # escape quotes 40 gsub(/\\[[:space:]]+$/, ""); # toss empty comments 41} 42 43# strip out empty lines 44/^ *$/ \ 45{ 46 next; 47} 48 49# emit / ** lines as multi-line C comments 50/^\\[[:space:]]\*\*/ \ 51{ 52 sub(/^\\[[:space:]]/, ""); 53 if (commenting == 0) printf "/*\n"; 54 printf "%s\n", $0; 55 commenting = 1; 56 next; 57} 58 59# strip blank lines 60/^[[:space:]]*$/ \ 61{ 62 next; 63} 64 65# function to close a comment, used later 66function end_comments() 67{ 68 commenting = 0; 69 printf "*/\n"; 70} 71 72# pass commented preprocessor directives 73/^\\[[:space:]]#/ \ 74{ 75 if (commenting) end_comments(); 76 sub(/^\\[[:space:]]/, ""); 77 printf "%s\n", $0; 78 next; 79} 80 81# toss all other full-line \ comments 82/^\\/ \ 83{ 84 if (commenting) end_comments(); 85 next; 86} 87 88# lop off trailing \ comments 89/\\[[:space:]]+/ \ 90{ 91 sub(/\\[[:space:]]+.*$/, ""); 92} 93 94# expunge ( ) comments 95/[[:space:]]+\([[:space:]][^)]*\)/ \ 96{ 97 sub(/[[:space:]]+\([[:space:]][^)]*\)/, ""); 98} 99 100# remove leading spaces 101/^[[:space:]]+/ \ 102{ 103 sub(/^[[:space:]]+/, ""); 104} 105 106# removing trailing spaces 107/[[:space:]]+$/ \ 108{ 109 sub(/[[:space:]]+$/, ""); 110} 111 112# strip out empty lines again (preceding rules may have generated some) 113/^[[:space:]]*$/ \ 114{ 115 if (commenting) end_comments(); 116 next; 117} 118 119# emit all other lines as quoted string fragments 120{ 121 if (commenting) end_comments(); 122 123 printf " \"%s \"\n", $0; 124 next; 125} 126 127END \ 128{ 129 if (commenting) end_comments(); 130 printf " \"quit \";\n"; 131 printf "\n\nvoid ficlCompileSoftCore(FICL_VM *pVM)\n"; 132 printf "{\n"; 133 printf " assert(ficlExec(pVM, softWords) != VM_ERREXIT);\n"; 134 printf "}\n"; 135} 136