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