diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index 8431da37d..000000000 --- a/.appveyor.yml +++ /dev/null @@ -1,17 +0,0 @@ -environment: - matrix: - - CYGWIN: C:\cygwin64 - -clone_depth: 1 - -init: - - git config --global core.autocrlf input - -install: - - '%CYGWIN%\bin\bash -lc "cygcheck -dc cygwin"' - - '%CYGWIN%\setup-x86_64 -q -P bison,flex,ninja' - -build_script: - - 'echo building...' - - '%CYGWIN%\bin\bash -lc "cd $APPVEYOR_BUILD_FOLDER; exec 0- + make + mingw-w64-i686-gcc + mingw-w64-i686-lua + ninja + bison + flex + zip + git + - uses: actions/checkout@v3 + - name: build + run: | + make -# build-windows: -# runs-on: windows-latest -# defaults: -# run: -# shell: msys2 {0} -# steps: -# - uses: msys2/setup-msys2@v2 -# with: -# update: true -# msystem: MINGW32 -# install: >- -# make -# mingw-w64-i686-gcc -# mingw-w64-x86_64-lua51 -# mingw-w64-x86_64-lua-luarocks -# ninja -# bison -# flex -# zip -# git -# - name: luarocks -# run: | -# git config --global url."https://".insteadOf git:// -# /mingw64/bin/luarocks --lua-version 5.1 install luaposix 33.0.0-1 -# - uses: actions/checkout@v3 -# - name: build -# run: | -# make LUA=/mingw64/bin/lua5.1 -# diff --git a/Makefile b/Makefile index fc29cd170..4db53e18e 100644 --- a/Makefile +++ b/Makefile @@ -105,7 +105,7 @@ else $(error unknown BUILDSYSTEM = $(BUILDSYSTEM)) endif -$(build-file): first/ackbuilder.lua Makefile +$(build-file): first/ackbuilder.lua Makefile $(lua-files) @mkdir -p $(BUILDDIR) @$(LUA) first/ackbuilder.lua \ first/build.lua build.lua \ diff --git a/README b/README index e0601efa4..07903da95 100644 --- a/README +++ b/README @@ -2,7 +2,7 @@ =================================== © 1987-2005 Vrije Universiteit, Amsterdam - 2018-02-23 + 2022-06-18 INTRODUCTION @@ -45,7 +45,8 @@ INSTALLATION ============ The version 5.0 build mechanism has been completely rewritten. Installation -ought to be fairly straightforward. +ought to be fairly straightforward. It will build on Unixishes including Linux, +OSX, and Windows using MSYS2 and mingw32. Requirements: diff --git a/build.lua b/build.lua index 1b459fb52..319571d8a 100644 --- a/build.lua +++ b/build.lua @@ -28,6 +28,13 @@ vars.plats_with_tests = { "pc86", } +local is_windows = os.getenv("OS") == "Windows_NT" + +local int = {} +if not is_windows then + int[#int+1] = "util/int+pkg" +end + installable { name = "ack-common", map = { @@ -41,10 +48,10 @@ installable { "util/arch+pkg", "util/ass+pkg", "util/ego+pkg", - "util/int+pkg", "util/led+pkg", "util/misc+pkg", "util/opt+pkg", + int }, } @@ -75,16 +82,29 @@ installable { }, } -normalrule { - name = "tests", - ins = { - "first/testsummary.sh", - test_packages - }, - outleaves = { - "stamp" - }, - commands = { - "%{ins}" +if not is_windows then + normalrule { + name = "tests", + ins = { + "first/testsummary.sh", + test_packages + }, + outleaves = { + "stamp" + }, + commands = { + "%{ins}" + } } -} +else + normalrule { + name = "tests", + ins = {}, + outleaves = { + "stamp" + }, + commands = { + "touch %{outs}" + } + } +end diff --git a/first/ackbuilder.lua b/first/ackbuilder.lua index 616c805d2..b2b41cf62 100644 --- a/first/ackbuilder.lua +++ b/first/ackbuilder.lua @@ -7,7 +7,6 @@ -- is = { set of rule types which made the target } -- } -local posix = require("posix") local emitter = {} local rules = {} local targets = {} @@ -21,6 +20,24 @@ local loadingstack = {} -- Forward references local loadtarget +-- Compatibility polyfill for load +local function loadf(text, source, mode, env) + if rawget(_G, "loadstring") and rawget(_G, "setfenv") then + local chunk, e = loadstring(text, "@"..source) + if chunk then + setfenv(chunk, env) + end + return chunk, e + else + return load(text, source, mode, env) + end +end + +-- Compatibility polyfill for unpack +if not rawget(_G, "unpack") then + unpack = table.unpack +end + local function print(...) local function print_no_nl(list) for _, s in ipairs(list) do @@ -125,7 +142,7 @@ local function concatpath(...) end -- Returns a list of the targets within the given collection; the keys of any --- keyed items are lost. Lists and wildcards are expanded. +-- keyed items are lost. Lists are expanded. local function targetsof(...) local o = {} @@ -226,9 +243,6 @@ local function abspath(...) return dotocollection({...}, function(filename) assertString(filename, 1) - if not filename:find("^[/$]") then - filename = concatpath(posix.getcwd(), filename) - end return filename end ) @@ -345,11 +359,10 @@ local function templateexpand(list, vars) o[#o+1] = s:gsub("%%%b{}", function(expr) expr = expr:sub(3, -2) - local chunk, e = loadstring("return ("..expr..")", expr) + local chunk, e = loadf("return ("..expr..")", expr, nil, vars) if e then error(string.format("error evaluating expression: %s", e)) end - setfenv(chunk, vars) local value = chunk() if (value == nil) then error(string.format("template expression '%s' expands to nil (probably an undefined variable)", expr)) @@ -381,10 +394,7 @@ local function loadbuildfile(filename) local thisglobals = {} thisglobals._G = thisglobals setmetatable(thisglobals, {__index = globals}) - chunk, e = loadstring(data, "@"..filename) - if not e then - setfenv(chunk, thisglobals) - end + chunk, e = loadf(data, filename, nil, thisglobals) end end if e then @@ -401,13 +411,17 @@ end local function loadbuildfilefor(filepart, targetpart) local normalname = concatpath(filepart, "/build.lua") - if posix.access(normalname, "r") then + local fp = io.open(normalname, "r") + if fp then + fp:close() loadbuildfile(normalname) return end local extendedname = concatpath(filepart, "/build-"..targetpart..".lua") - if posix.access(extendedname, "r") then + fp = io.open(extendedname, "r") + if fp then + fp:close() loadbuildfile(extendedname) return end @@ -424,10 +438,7 @@ loadtarget = function(targetname) if not targetname:find("%+") then local files if targetname:find("[?*]") then - files = posix.glob(targetname) - if not files then - files = {} - end + error("wildcards not supported") else files = {targetname} end @@ -823,8 +834,6 @@ local function parse_arguments(argmap, arg) end globals = { - posix = posix, - abspath = abspath, asstring = asstring, basename = basename, diff --git a/first/yacc.lua b/first/bison.lua similarity index 91% rename from first/yacc.lua rename to first/bison.lua index bffaeee4c..b55ccef8e 100644 --- a/first/yacc.lua +++ b/first/bison.lua @@ -1,10 +1,10 @@ -definerule("yacc", +definerule("bison", { srcs = { type="targets" }, commands = { type="strings", default={ - "yacc -t -b %{dir}/y -d %{ins}" + "bison -t -b %{dir}/y -d %{ins}" } }, }, diff --git a/h/build.lua b/h/build.lua index ad677aacf..4163e8249 100644 --- a/h/build.lua +++ b/h/build.lua @@ -23,7 +23,23 @@ normalrule { clibrary { name = "emheaders", hdrs = { - "./*.h", + "./arch.h", + "./as_spec.h", + "./cgg_cg.h", + "./cg_pattern.h", + "./em_abs.h", + "./em_ego.h", + "./em_flag.h", + "./em_mes.h", + "./em_ptyp.h", + "./em_reg.h", + "./ip_spec.h", + "./ocm_chan.h", + "./ocm_parco.h", + "./ocm_proc.h", + "./out.h", + "./ranlib.h", + "./stb.h", "./con_float", "+em_path", "+local", diff --git a/h/em_table_lib.lua b/h/em_table_lib.lua new file mode 100644 index 000000000..e43a9dee4 --- /dev/null +++ b/h/em_table_lib.lua @@ -0,0 +1,88 @@ +local function strip(s) + return s:match("^%s*(.-)%s*$") +end + +function load_table() + local specs = {} + for line in io.lines() do + line = strip(line) + if line == "" then + break + end + + local _, _, name, num = line:find("^(%w+)%s+(%d+)$") + if not name then + error("malformed spec line in em_table") + end + + specs[#specs+1] = { + name = name, + num = tonumber(num) + } + end + + for _, v in ipairs(specs) do + specs[v.name] = v + end + + local pseudos = {} + local pseudo_count = 0 + for line in io.lines() do + line = strip(line) + if line == "" then + break + end + + local _, _, name, num, flags = line:find("^(%w+)%s+(%d+)%s+(%g+)$") + if not name then + error("malformed pseudo line in em_table") + end + + pseudos[#pseudos+1] = { + name = name, + num = tonumber(num) + specs.fpseu.num, + flags = flags + } + pseudo_count = pseudo_count + 1 + end + + local mnems = {} + local mnem_count = 0 + for line in io.lines() do + line = strip(line) + if line == "" then + break + end + + local _, _, name, flags1, flags2 = line:find("^(%w+)%s+(%g+)%s+(%g+)$") + if not name then + error("malformed mnemonic line in em_table") + end + + mnem_count = mnem_count + 1 + mnems[#mnems+1] = { + name = name, + num = mnem_count, + flags1 = flags1, + flags2 = flags2 + } + end + + local lpseu = { + name = "lpseu", + num = specs.fpseu.num + pseudo_count - 1 + } + local lmnem = { + name = "lmnem", + num = specs.fmnem.num + mnem_count - 1 + } + + specs[#specs+1] = lpseu + specs.lpseu = lpseu + + specs[#specs+1] = lmnem + specs.lmnem = lmnem + + return specs, pseudos, mnems +end + diff --git a/lang/a68s/util/xref.c b/lang/a68s/util/xref.c index 4f7beb16e..cc93b5abd 100644 --- a/lang/a68s/util/xref.c +++ b/lang/a68s/util/xref.c @@ -93,13 +93,13 @@ int narg; postin[0] = dup(0); if (pass1) { if (useroif) { - if ((hashin = fopen(oifile, "r")) == NULL) + if ((hashin = fopen(oifile, "rb")) == NULL) fatal("bad ignore/only file: %s",oifile); buildhash(); fclose(hashin); } input = stdin; - output = fdopen(scanout[1], "w"); + output = fdopen(scanout[1], "wb"); nfiles = argc; setjmp(env); while (argc--) @@ -203,9 +203,9 @@ scan(s) char *s; oifsuf++; if (lastc != oifile[oifsuf] ) { oifile[oifsuf] = lastc; - if ((hashin = fopen(oifile, "r")) == NULL) { + if ((hashin = fopen(oifile, "rb")) == NULL) { oifile[oifsuf] = 'x'; - if ((hashin = fopen(oifile, "r")) == NULL) + if ((hashin = fopen(oifile, "rb")) == NULL) fatal("cannot open %s",oifile); } buildhash(); @@ -215,7 +215,7 @@ scan(s) char *s; if (s[0]=='-' && s[1]=='\0') input = stdin; else - if ((input = fopen(s, "r")) == NULL) + if ((input = fopen(s, "rb")) == NULL) fatal("cannot open %s",s); switch (type) { case 'x': diff --git a/lang/b/compiler/b.h b/lang/b/compiler/b.h index 6c5a4febb..ab66d0b29 100644 --- a/lang/b/compiler/b.h +++ b/lang/b/compiler/b.h @@ -45,7 +45,7 @@ extern const char* modulename; extern int paramsize; extern struct hshtab hshtab[HSHSIZ]; extern int hshused; -extern int eof; +extern int ateof; extern int peekc; extern const char* ctab; extern struct hshtab *bsym; diff --git a/lang/b/compiler/b0.c b/lang/b/compiler/b0.c index 077a3abb3..1d96857fd 100644 --- a/lang/b/compiler/b0.c +++ b/lang/b/compiler/b0.c @@ -22,7 +22,7 @@ int string_part; int paramsize; struct hshtab hshtab[HSHSIZ]; int hshused; -int eof; +int ateof; int peekc; const char* ctab; struct hshtab *bsym; @@ -129,7 +129,7 @@ main(int argc, char *argv[]) string_part = 0; code_part = C_getid(); C_beginpart(code_part); - while (!eof) { + while (!ateof) { extdef(); blkend(); } @@ -368,12 +368,12 @@ symbol(void) c = peekc; peekc = 0; } else - if (eof) + if (ateof) return EOFC; else c = getchar(); if (c==EOF) { - eof++; + ateof++; return(EOFC); } @@ -453,7 +453,7 @@ loop: } } } - eof++; + ateof++; error("Nonterminated comment"); return EOFC; @@ -820,7 +820,7 @@ stmt: if ((o = symbol()) == LBRACE) { if (d) blkhed(); - while (!eof) { + while (!ateof) { if ((o = symbol()) == RBRACE) goto bend; pushsym(o); diff --git a/lang/b/compiler/build.lua b/lang/b/compiler/build.lua index c647f6036..a195b7fdd 100644 --- a/lang/b/compiler/build.lua +++ b/lang/b/compiler/build.lua @@ -2,10 +2,11 @@ cprogram { name = "em_b", srcs = { - "./*.c", + "./b0.c", + "./b1.c", }, deps = { - "./*.h", + "./b.h", "modules+headers", "modules/src/alloc+lib", "modules/src/data+lib", diff --git a/lang/b/lib/build.lua b/lang/b/lib/build.lua index 62ae88966..d778fe092 100644 --- a/lang/b/lib/build.lua +++ b/lang/b/lib/build.lua @@ -4,12 +4,12 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, srcs = { - "./*.c", - "./*.e", + "./init.c", + "./main.c", }, hdrs = {}, -- must be empty deps = { - "./*.h", + "./b.h", "h+emheaders", "lang/cem/libcc.ansi/headers+pkg", "plat/"..plat.."/include+pkg", diff --git a/lang/basic/lib/build.lua b/lang/basic/lib/build.lua index f99ebfed3..d48879f75 100644 --- a/lang/basic/lib/build.lua +++ b/lang/basic/lib/build.lua @@ -4,15 +4,47 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, srcs = { - "./*.c", - "./*.e", + "./abs.c", + "./asc.c", + "./asrt.c", + "./atn.c", + "./chr.c", + "./conversion.c", + "./error.c", + "./exp.c", + "./file.c", + "./hlt.c", + "./io.c", + "./log.c", + "./mki.c", + "./oct.c", + "./peek.c", + "./power.c", + "./print.c", + "./random.c", + "./read.c", + "./return.c", + "./salloc.c", + "./sgn.c", + "./sin.c", + "./sqt.c", + "./stop.c", + "./string.c", + "./swap.c", + "./trace.c", + "./trap.c", + "./write.c", + "./fef.e", + "./fif.e", + "./setline.e", }, hdrs = {}, -- must be empty deps = { "h+emheaders", "lang/cem/libcc.ansi/headers+pkg", "plat/"..plat.."/include+pkg", - "./*.h", + "./bc_io.h", + "./lib.h", }, vars = { plat = plat } } diff --git a/lang/basic/lib/file.c b/lang/basic/lib/file.c index cba32c439..55a8f4215 100644 --- a/lang/basic/lib/file.c +++ b/lang/basic/lib/file.c @@ -76,19 +76,19 @@ void _opnchn(int reclen, String* fname, String* mode) { case 'O': case 'o': - if ((f = fopen(fname->strval, "w")) == NULL) + if ((f = fopen(fname->strval, "wb")) == NULL) error(28); m = OMODE; break; case 'I': case 'i': - if ((f = fopen(fname->strval, "r")) == NULL) + if ((f = fopen(fname->strval, "rb")) == NULL) error(28); m = IMODE; break; case 'r': case 'R': - if ((f = fopen(fname->strval, "a")) == NULL) + if ((f = fopen(fname->strval, "ab")) == NULL) error(28); m = RMODE; break; diff --git a/lang/basic/src/basic.lex b/lang/basic/src/basic.lex index 39d87e9ff..fc6dd34d6 100644 --- a/lang/basic/src/basic.lex +++ b/lang/basic/src/basic.lex @@ -572,6 +572,7 @@ int yylex(void) /* handle double operators */ case ' ': case '\t': + case '\r': cptr++; return(yylex()); case '&': diff --git a/lang/basic/src/build.lua b/lang/basic/src/build.lua index 26e3074de..24f38da81 100644 --- a/lang/basic/src/build.lua +++ b/lang/basic/src/build.lua @@ -2,30 +2,48 @@ include("util/LLgen/build.lua") llgen { name = "llgen", - srcs = { "./*.g" } + srcs = { "./basic.g" } } normalrule { name = "tokentab_h", ins = { "./maketokentab", - "util/cmisc+ed", matching(filenamesof("+llgen"), "/Lpars.h$"), }, outleaves = { "tokentab.h" }, commands = { - "%{ins} %{outs}" + "%{ins[1]} < %{ins[2]} > %{outs}" } } cprogram { name = "em_bem", srcs = { - "./*.c", + "./bem.c", + "./compile.c", + "./eval.c", + "./func.c", + "./gencode.c", + "./graph.c", + "./initialize.c", + "./parsepar.c", + "./symbols.c", + "./util.c", matching(filenamesof("+llgen"), "%.c$"), }, deps = { - "./*.h", + "./bem.h", + "./eval.h", + "./func.h", + "./gencode.h", + "./graph.h", + "./llmess.h", + "./parsepar.h", + "./symbols.h", + "./util.h", + "./yylexp.h", + "./basic.lex", "+llgen", "+tokentab_h", "h+emheaders", diff --git a/lang/basic/src/maketokentab b/lang/basic/src/maketokentab index c388c5d99..ee6e8a4e0 100755 --- a/lang/basic/src/maketokentab +++ b/lang/basic/src/maketokentab @@ -1,17 +1,6 @@ #!/bin/sh -$1 -s "${2:-Lpars.h}" > $3 <<'+' -1d -1,$s/# *define // -1,$s/ ...$// -1,$s/^/ "/ -1,$-1s/$/",/ -$s/$/"/ -0a -char *tokentab[] = { -. -$a -}; -. -1,$p -+ +echo "char* tokentab[] = {" +awk '/^#define/ { print "\"" $2 "\"," }' +echo "};" + diff --git a/lang/cem/cemcom.ansi/BigPars b/lang/cem/cemcom.ansi/BigPars index 882841e64..8226992a2 100644 --- a/lang/cem/cemcom.ansi/BigPars +++ b/lang/cem/cemcom.ansi/BigPars @@ -1,135 +1,135 @@ -!File: lint.h -/*#define LINT 1 *//* if defined, 'lint' is produced */ - - -!File: pathlength.h -#define PATHLENGTH 1024 /* max. length of path to file */ - - -!File: errout.h -#define ERROUT STDERR /* file pointer for writing messages */ -#define ERR_SHADOW 5 /* a syntax error overshadows error messages - until ERR_SHADOW symbols have been - accepted without syntax error */ - - -!File: idfsize.h -#define IDFSIZE 64 /* maximum significant length of an identifier */ - - -!File: numsize.h -#define NUMSIZE 256 /* maximum length of a numeric constant */ - - -!File: nparams.h -#define NPARAMS 32 /* maximum number of parameters */ -#define STDC_NPARAMS 31 /* ANSI limit on number of parameters */ - - -!File: ifdepth.h -#define IFDEPTH 256 /* maximum number of nested if-constructions */ - - -!File: density.h -#define DENSITY 3 /* see switch.[ch] for an explanation */ - - -!File: macbuf.h -#define LAPBUF 128 /* initial size of macro replacement buffer */ -#define ARGBUF 128 /* initial size of macro parameter buffer(s) */ - - -!File: strsize.h -#define ISTRSIZE 32 /* minimum number of bytes allocated for - storing a string */ -#define RSTRSIZE 16 /* step size in enlarging the memory for - the storage of a string */ - - -!File: trgt_sizes.h -#define MAXSIZE 8 /* the maximum of the SZ_* constants */ - -/* target machine sizes */ -#define SZ_CHAR 1 -#define SZ_SHORT 2 -#define SZ_WORD 4 -#define SZ_INT 4 -#define SZ_LONG 4 -#define SZ_LNGLNG -1 -#define SZ_FLOAT 4 -#define SZ_DOUBLE 8 -#define SZ_LNGDBL 8 /* for now */ -#define SZ_POINTER 4 - -/* target machine alignment requirements */ -#define AL_CHAR 1 -#define AL_SHORT SZ_SHORT -#define AL_WORD SZ_WORD -#define AL_INT SZ_WORD -#define AL_LONG SZ_WORD -#define AL_LNGLNG SZ_WORD -#define AL_FLOAT SZ_WORD -#define AL_DOUBLE SZ_WORD -#define AL_LNGDBL SZ_WORD -#define AL_POINTER SZ_WORD -#define AL_STRUCT 1 -#define AL_UNION 1 - - -!File: botch_free.h -/*#define BOTCH_FREE 1* *//* when defined, botch freed memory, as a check */ - - -!File: dataflow.h -#define DATAFLOW 1 /* produce some compile-time xref */ - - -!File: debug.h -/*#define DEBUG 1 *//* perform various self-tests */ -#define NDEBUG 1 /* disable assertions */ - - -!File: use_tmp.h -#define PREPEND_SCOPES 1 /* collect exa, exp, ina and inp commands - and if USE_TMP is defined let them - precede the rest of the generated - compact code */ -#define USE_TMP 1 /* use C_insertpart, C_endpart mechanism - to generate EM-code in the order needed - for the code-generators. If not defined, - the old-style peephole optimizer is - needed. */ - - -!File: parbufsize.h -#define PARBUFSIZE 1024 - - -!File: textsize.h -#define ITEXTSIZE 32 /* 1st piece of memory for repl. text */ - - -!File: inputtype.h -#define INP_READ_IN_ONE 1 /* read input file in one */ - - -!File: nobitfield.h -/*#define NOBITFIELD 1 *//* if NOT defined, implement bitfields */ - - -!File: static.h -#define GSTATIC /* for large global "static" arrays */ - - -!File: nocross.h -/*#define NOCROSS 1 *//* if NOT defined, cross compiler */ - - -!File: regcount.h -/*#define REGCOUNT 1 *//* count occurrences for register messages */ - - -!File: dbsymtab.h -#define DBSYMTAB 1 /* ability to produce symbol table for debugger */ - - +!File: lint.h +/*#define LINT 1 *//* if defined, 'lint' is produced */ + + +!File: pathlength.h +#define PATHLENGTH 1024 /* max. length of path to file */ + + +!File: errout.h +#define ERROUT STDERR /* file pointer for writing messages */ +#define ERR_SHADOW 5 /* a syntax error overshadows error messages + until ERR_SHADOW symbols have been + accepted without syntax error */ + + +!File: idfsize.h +#define IDFSIZE 64 /* maximum significant length of an identifier */ + + +!File: numsize.h +#define NUMSIZE 256 /* maximum length of a numeric constant */ + + +!File: nparams.h +#define NPARAMS 32 /* maximum number of parameters */ +#define STDC_NPARAMS 31 /* ANSI limit on number of parameters */ + + +!File: ifdepth.h +#define IFDEPTH 256 /* maximum number of nested if-constructions */ + + +!File: density.h +#define DENSITY 3 /* see switch.[ch] for an explanation */ + + +!File: macbuf.h +#define LAPBUF 128 /* initial size of macro replacement buffer */ +#define ARGBUF 128 /* initial size of macro parameter buffer(s) */ + + +!File: strsize.h +#define ISTRSIZE 32 /* minimum number of bytes allocated for + storing a string */ +#define RSTRSIZE 16 /* step size in enlarging the memory for + the storage of a string */ + + +!File: trgt_sizes.h +#define MAXSIZE 8 /* the maximum of the SZ_* constants */ + +/* target machine sizes */ +#define SZ_CHAR 1 +#define SZ_SHORT 2 +#define SZ_WORD 4 +#define SZ_INT 4 +#define SZ_LONG 4 +#define SZ_LNGLNG -1 +#define SZ_FLOAT 4 +#define SZ_DOUBLE 8 +#define SZ_LNGDBL 8 /* for now */ +#define SZ_POINTER 4 + +/* target machine alignment requirements */ +#define AL_CHAR 1 +#define AL_SHORT SZ_SHORT +#define AL_WORD SZ_WORD +#define AL_INT SZ_WORD +#define AL_LONG SZ_WORD +#define AL_LNGLNG SZ_WORD +#define AL_FLOAT SZ_WORD +#define AL_DOUBLE SZ_WORD +#define AL_LNGDBL SZ_WORD +#define AL_POINTER SZ_WORD +#define AL_STRUCT 1 +#define AL_UNION 1 + + +!File: botch_free.h +/*#define BOTCH_FREE 1* *//* when defined, botch freed memory, as a check */ + + +!File: dataflow.h +#define DATAFLOW 1 /* produce some compile-time xref */ + + +!File: debug.h +/*#define DEBUG 1 *//* perform various self-tests */ +#define NDEBUG 1 /* disable assertions */ + + +!File: use_tmp.h +#define PREPEND_SCOPES 1 /* collect exa, exp, ina and inp commands + and if USE_TMP is defined let them + precede the rest of the generated + compact code */ +#define USE_TMP 1 /* use C_insertpart, C_endpart mechanism + to generate EM-code in the order needed + for the code-generators. If not defined, + the old-style peephole optimizer is + needed. */ + + +!File: parbufsize.h +#define PARBUFSIZE 1024 + + +!File: textsize.h +#define ITEXTSIZE 32 /* 1st piece of memory for repl. text */ + + +!File: inputtype.h +#define INP_READ_IN_ONE 1 /* read input file in one */ + + +!File: nobitfield.h +/*#define NOBITFIELD 1 *//* if NOT defined, implement bitfields */ + + +!File: static.h +#define GSTATIC /* for large global "static" arrays */ + + +!File: nocross.h +/*#define NOCROSS 1 *//* if NOT defined, cross compiler */ + + +!File: regcount.h +/*#define REGCOUNT 1 *//* count occurrences for register messages */ + + +!File: dbsymtab.h +#define DBSYMTAB 1 /* ability to produce symbol table for debugger */ + + diff --git a/lang/cem/cemcom.ansi/build.lua b/lang/cem/cemcom.ansi/build.lua index 8d9f0d6c0..51554e728 100644 --- a/lang/cem/cemcom.ansi/build.lua +++ b/lang/cem/cemcom.ansi/build.lua @@ -13,11 +13,34 @@ normalrule { } } -local str_files = basename(filenamesof("./*.str")) +local str_files = { + "./code.str", + "./declar.str", + "./def.str", + "./estack.str", + "./expr.str", + "./field.str", + "./idf.str", + "./l_brace.str", + "./l_outdef.str", + "./l_state.str", + "./macro.str", + "./next.str", + "./proto.str", + "./stack.str", + "./stmt.str", + "./struct.str", + "./switch.str", + "./type.str", + "./util.str" +} + +local str_bases = basename(filenamesof(str_files)) + local str_targets = {} -for _, f in ipairs(str_files) do - local bf = f:gsub("%.str$", "") +for _, f in ipairs(str_bases) do + local bf = f:gsub("%.str$", ""):gsub("^$./", "") str_targets[#str_targets+1] = normalrule { name = "allocd_header/"..bf, ins = { "./make.allocd", "./"..f }, @@ -32,7 +55,7 @@ normalrule { name = "next-c", ins = { "./make.next", - "./*.str", + str_files }, outleaves = { "next.c" }, commands = { @@ -78,7 +101,11 @@ llgen { name = "llgen", srcs = { "+tokenfile-g", -- must be first - "./*.g", + "./declar.g", + "./expression.g", + "./ival.g", + "./program.g", + "./statement.g", }, } diff --git a/lang/cem/cemcom.ansi/declar.g b/lang/cem/cemcom.ansi/declar.g index abd7263d4..56d8596eb 100644 --- a/lang/cem/cemcom.ansi/declar.g +++ b/lang/cem/cemcom.ansi/declar.g @@ -1,772 +1,772 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* $Id$ */ -/* DECLARATION SYNTAX PARSER */ - -{ -#include "parameters.h" -#include -#include -#include "idf.h" -#include "arith.h" -#include "LLlex.h" -#include "label.h" -#include "code.h" -#include "type.h" -#include "proto.h" -#include "struct.h" -#include "field.h" -#include "decspecs.h" -#include "declarator.h" -#include "def.h" -#include "declar.h" -#include "label.h" -#include "expr.h" -#include "sizes.h" -#include "level.h" -#include "error.h" -#include "stab.h" - -#ifdef LINT -#include "l_lint.h" -#endif /* LINT */ - -extern char options[]; -} - -/* 3.5 */ -declaration - {struct decspecs Ds;} -: - {Ds = null_decspecs;} - decl_specifiers(&Ds) - init_declarator_list(&Ds)? - ';' -; - -/* A `decl_specifiers' describes a sequence of a storage_class_specifier, - an unsigned_specifier, a size_specifier and a simple type_specifier, - which may occur in arbitrary order and each of which may be absent; - at least one of them must be present, however, since the totally - empty case has already be dealt with in `external_definition'. - This means that something like: - unsigned extern int short xx; - is perfectly legal C. - - On top of that, multiple occurrences of storage_class_specifiers, - unsigned_specifiers and size_specifiers are errors, but a second - type_specifier should end the decl_specifiers and be treated as - the name to be declared. - Such a language is not easily expressed in a grammar; enumeration - of the permutations is unattractive. We solve the problem by - having a regular grammar for the "soft" items, handling the single - occurrence of the type_specifier in the grammar (we have no choice), - collecting all data in a `struct decspecs' and turning that data - structure into what we want. - - The existence of declarations like - short typedef yepp; - makes all hope of writing a specific grammar for typedefs illusory. -*/ -/* Accept a single declaration specifier. Then accept zero or more - declaration specifiers. There can be a conflict on both - TYPE_IDENTIFIER and IDENTIFIER. - The following rule is used: - When we see a TYPE_IDENTIFIER, we accept it if no type-specifier was - given, and it is not directly followed by an identifier. If a - type-specifier was given, it is taken as the identifier being - declared. If it is followed by an identifier, we assume that an - error has been made, (e.g. unsigned typedeffed_int x;) and that - this will be detected later on. - When we see an IDENTIFIER, directly followed by another IDENTIFIER, - we assume that a typing mistake has been made, and we accept it as - an erroneous type-identifier. -*/ - -decl_specifiers /* non-empty */ (register struct decspecs *ds;) - /* Reads a non-empty decl_specifiers and fills the struct - decspecs *ds. - */ -: - single_decl_specifier(ds) - [ %while( (DOT==TYPE_IDENTIFIER - && ds->ds_size == 0 - && ds->ds_unsigned == 0 - && ds->ds_type == (struct type *)0) - || AHEAD == IDENTIFIER) /* always an error */ - single_decl_specifier(ds) - ]* - {do_decspecs(ds);} -; - -single_decl_specifier /* non_empty */ (register struct decspecs *ds;) -: - [ AUTO | STATIC | EXTERN | TYPEDEF | REGISTER ] - { if (ds->ds_sc_given) - error("repeated storage class specifier"); - ds->ds_sc_given = 1; - ds->ds_sc = DOT; - } -| - VOLATILE - { if (ds->ds_typequal & TQ_VOLATILE) - error("repeated type qualifier"); - ds->ds_typequal |= TQ_VOLATILE; - } -| - CONST - { if (ds->ds_typequal & TQ_CONST) - error("repeated type qualifier"); - ds->ds_typequal |= TQ_CONST; - } -| - [ SHORT | LONG ] - { if (ds->ds_size == LONG && DOT == LONG) - ds->ds_size = LNGLNG; - else { - if (ds->ds_size) - error("repeated size specifier"); - ds->ds_size = DOT; - } - } -| - [ SIGNED | UNSIGNED ] - { if (ds->ds_unsigned != 0) - error("repeated sign specifier"); - ds->ds_unsigned = DOT; - } -| - [ VOID | CHAR | INT | FLOAT | DOUBLE ] - { - idf2type(dot.tk_idf, &ds->ds_type); - ds->ds_typedef = 0; - } -| - %default TYPE_IDENTIFIER - { - idf2type(dot.tk_idf, &ds->ds_type); - ds->ds_typedef = 1; - } -| - %erroneous - IDENTIFIER - { - error("%s is not a type identifier", dot.tk_idf->id_text); - ds->ds_type = error_type; - if (dot.tk_idf->id_def) { - dot.tk_idf->id_def->df_type = error_type; - dot.tk_idf->id_def->df_sc = TYPEDEF; - } - } -| - %illegal - IDENTIFIER -| - struct_or_union_specifier(&ds->ds_type) -| - enum_specifier(&ds->ds_type) -; - -/* 3.5.2 */ -type_specifier(struct type **tpp;) - /* Used in struct/union declarations and in casts; only the - type is relevant. - */ - {struct decspecs Ds; Ds = null_decspecs;} -: - decl_specifiers(&Ds) - { - if (Ds.ds_sc_given) - error("storage class ignored"); - if (Ds.ds_sc == REGISTER) - error("register ignored"); - } - {*tpp = Ds.ds_type;} -; - -/* 3.5 */ -init_declarator_list(struct decspecs *ds;): - init_declarator(ds) - [ ',' init_declarator(ds) ]* -; - -init_declarator(register struct decspecs *ds;) - { - struct declarator Dc; - } -: - { - Dc = null_declarator; - } -[ - declarator(&Dc) - { - reject_params(&Dc); - declare_idf(ds, &Dc, level); -#ifdef LINT - lint_declare_idf(Dc.dc_idf, ds->ds_sc); -#endif /* LINT */ - } - [ - initializer(Dc.dc_idf, ds->ds_sc) - | - { code_declaration(Dc.dc_idf, (struct expr *) 0, level, ds->ds_sc); } - ] -] - { -#ifdef LINT - add_auto(Dc.dc_idf); -#endif /* LINT */ - remove_declarator(&Dc); - } -; - -/* 3.5.7: initializer */ -initializer(struct idf *idf; int sc;) - { - struct expr *expr = (struct expr *) 0; - int fund = idf->id_def->df_type->tp_fund; - int autoagg = (level >= L_LOCAL - && sc != STATIC - && ( fund == STRUCT - || fund == UNION - || fund == ARRAY)); - int globalflag = level == L_GLOBAL - || (level >= L_LOCAL && sc == STATIC); - } -: - { if (idf->id_def->df_type->tp_fund == FUNCTION) { - error("illegal initialization of function"); - idf->id_def->df_type->tp_fund = ERRONEOUS; - } - if (level == L_FORMAL2) - error("illegal initialization of formal parameter"); - } - '=' - { - if (AHEAD != '{' && AHEAD != STRING ) autoagg = 0; -#ifdef LINT - lint_statement(); -#endif /* LINT */ - if (globalflag) { - struct expr ex; - code_declaration(idf, &ex, level, sc); - } - else if (autoagg) - loc_init((struct expr *) 0, idf); - } - initial_value((globalflag || autoagg) ? - &(idf->id_def->df_type) - : (struct type **)0, - &expr) - { if (! globalflag) { - if (idf->id_def->df_type->tp_fund == FUNCTION) { - free_expression(expr); - expr = 0; - } -#ifdef DEBUG - print_expr("initializer-expression", expr); -#endif /* DEBUG */ -#ifdef LINT - change_state(idf, SET); -#endif /* LINT */ -#ifdef DBSYMTAB - if (options['g'] && level >= L_LOCAL && expr) { - db_line(expr->ex_file, (unsigned) expr->ex_line); - } -#endif /* DBSYMTAB */ - if (autoagg) - loc_init((struct expr *) 0, idf); - else code_declaration(idf, expr, level, sc); - } -#ifdef DBSYMTAB - if (options['g'] && globalflag) { - stb_string(idf->id_def, sc, idf->id_text); - } -#endif /* DBSYMTAB */ - idf_initialized(idf); - } -; - -/* - Functions yielding pointers to functions must be declared as, e.g., - int (*hehe(par1, par2))() char *par1, *par2; {} - Since the function heading is read as a normal declarator, - we just include the (formal) parameter list in the declarator - description list dc. -*/ -/* 3.5.4 */ -declarator(register struct declarator *dc;) - { struct formal *fm = NO_PARAMS; - struct proto *pl = NO_PROTO; - arith count; - int qual; - } -: - primary_declarator(dc) - [/*%while(1)*/ - '(' - [ %if (DOT != IDENTIFIER) - parameter_type_list(&pl) - | - formal_list(&fm) - | - /* empty */ - ] - ')' - { add_decl_unary(dc, FUNCTION, 0, (arith)0, fm, pl); - fm = NO_PARAMS; - } - | - arrayer(&count) - {add_decl_unary(dc, ARRAY, 0, count, NO_PARAMS, NO_PROTO);} - ]* -| - pointer(&qual) declarator(dc) - {add_decl_unary(dc, POINTER, qual, (arith)0, NO_PARAMS, NO_PROTO);} -; - -primary_declarator(register struct declarator *dc;) : - identifier(&dc->dc_idf) -| - '(' declarator(dc) ')' -; - -arrayer(arith *sizep;) - { struct expr *expr; } -: - '[' - { *sizep = (arith)-1; } - [ - constant_expression(&expr) - { - check_array_subscript(expr); - *sizep = (arith)expr->VL_VALUE; - free_expression(expr); - } - ]? - ']' -; - -formal_list (struct formal **fmp;) -: - formal(fmp) [ %persistent ',' formal(fmp) ]* -; - -formal(struct formal **fmp;) - {struct idf *idf; } -: - identifier(&idf) - { - register struct formal *new = new_formal(); - - new->fm_idf = idf; - new->next = *fmp; - *fmp = new; - if (idf->id_def && idf->id_def->df_sc == TYPEDEF) { - error("typedef name %s may not be redeclared as a parameter", idf->id_text); - } - } -; - -/* Change 2 */ -enum_specifier(register struct type **tpp;) - { - struct idf *idf; - arith l = (arith)0; - } -: - {if (*tpp) error("multiple types in declaration");} - ENUM - [ - {declare_struct(ENUM, (struct idf *) 0, tpp);} - enumerator_pack(*tpp, &l) - | - identifier(&idf) - [ - {declare_struct(ENUM, idf, tpp);} - enumerator_pack(*tpp, &l) - { -#ifdef DBSYMTAB - if (options['g']) { - stb_tag(idf->id_tag, idf->id_text); - } -#endif /*DBSYMTAB */ - } - | - {apply_struct(ENUM, idf, tpp);} - /* empty */ - ] - ] -; - -enumerator_pack(register struct type *tp; arith *lp;) : - '{' - enumerator(tp, lp) - [%while (AHEAD != '}') - ',' - enumerator(tp, lp) - ]* - [ - ',' {warning("unexpected trailing comma in enumerator pack");} - ]? - '}' - {tp->tp_size = int_size;} - /* fancy implementations that put small enums in 1 byte - or so should start here. - */ -; - -enumerator(struct type *tp; arith *lp;) - { - struct idf *idf; - struct expr *expr; - } -: - identifier(&idf) - [ - '=' - constant_expression(&expr) - { - *lp = (arith)expr->VL_VALUE; - free_expression(expr); - } - ]? - {declare_enum(tp, idf, (*lp)++);} -; - -/* 8.5 */ -struct_or_union_specifier(register struct type **tpp;) - { - int fund; - struct idf *idfX; - register struct idf *idf; - } -: - {if (*tpp) error("multiple types in declaration");} - [ STRUCT | UNION ] - {fund = DOT;} - [ - { - declare_struct(fund, (struct idf *)0, tpp); - } - struct_declaration_pack(*tpp) - | - identifier(&idfX) { idf = idfX; } - [ - { - declare_struct(fund, idf, tpp); - (idf->id_tag->tg_busy)++; - } - struct_declaration_pack(*tpp) - { - (idf->id_tag->tg_busy)--; -#ifdef DBSYMTAB - if (options['g']) { - stb_tag(idf->id_tag, idf->id_text); - } -#endif /*DBSYMTAB */ - } - | - { - /* a ';' means an empty declaration (probably) - * this means that we have to declare a new - * structure. (yegh) - */ - if (DOT == ';' && - ( !idf->id_tag || - idf->id_tag->tg_level != level || - idf->id_tag->tg_type->tp_size < 0 - )) declare_struct(fund, idf, tpp); - else apply_struct(fund, idf, tpp); - } - /* empty */ - ] - ] -; - -struct_declaration_pack(register struct type *stp;) - { - struct sdef **sdefp = &stp->tp_sdef; - arith size = (arith)0; - } -: - /* The size is only filled in after the whole struct has - been read, to prevent recursive definitions. - */ - '{' - struct_declaration(stp, &sdefp, &size)+ - '}' - {stp->tp_size = align(size, stp->tp_align); - completed(stp); - } -; - -struct_declaration(struct type *stp; struct sdef ***sdefpp; arith *szp;) - {struct type *tp;} -: - type_specifier(&tp) struct_declarator_list(tp, stp, sdefpp, szp) ';' -; - -struct_declarator_list(struct type *tp; struct type *stp; - struct sdef ***sdefpp; arith *szp;) -: - struct_declarator(tp, stp, sdefpp, szp) - [ ',' struct_declarator(tp, stp, sdefpp, szp) ]* -; - -struct_declarator(struct type *tp; struct type *stp; - struct sdef ***sdefpp; arith *szp;) - { - struct declarator Dc; - struct field *fd = 0; - } -: - { - Dc = null_declarator; - } -[ - declarator(&Dc) - {reject_params(&Dc);} - bit_expression(&fd)? -| - {Dc.dc_idf = gen_idf();} - bit_expression(&fd) -] - {add_sel(stp, declare_type(tp, &Dc), Dc.dc_idf, sdefpp, szp, fd);} - {remove_declarator(&Dc);} -; - -bit_expression(struct field **fd;) - { struct expr *expr; } -: - { - *fd = new_field(); - } - ':' - constant_expression(&expr) - { - (*fd)->fd_width = (arith)expr->VL_VALUE; - free_expression(expr); -#ifdef NOBITFIELD - error("bitfields are not implemented"); -#endif /* NOBITFIELD */ - } -; - -/* 8.7 */ -cast(struct type **tpp;) - {struct declarator Dc;} -: - {Dc = null_declarator;} - '(' - type_specifier(tpp) - abstract_declarator(&Dc) - ')' - {*tpp = declare_type(*tpp, &Dc);} - {remove_declarator(&Dc);} -; - -/* This code is an abject copy of that of 'declarator', for lack of - a two-level grammar. -*/ -abstract_declarator(register struct declarator *dc;) - { struct proto *pl = NO_PROTO; - arith count; - int qual; - } -: - primary_abstract_declarator(dc) - [ - '(' - [ - parameter_type_list(&pl) - | - /* empty */ - ] - ')' - {add_decl_unary(dc, FUNCTION, 0, (arith)0, NO_PARAMS, pl); - if (pl) remove_proto_idfs(pl); - } - | - arrayer(&count) - {add_decl_unary(dc, ARRAY, 0, count, NO_PARAMS, NO_PROTO);} - ]* -| - pointer(&qual) abstract_declarator(dc) - {add_decl_unary(dc, POINTER, qual, (arith)0, NO_PARAMS, NO_PROTO);} -; - -%first first_of_parameter_type_list, parameter_type_list; - -primary_abstract_declarator(struct declarator *dc;) -: -[%if (AHEAD == ')' || first_of_parameter_type_list(AHEAD)) - /* empty */ -| - '(' abstract_declarator(dc) ')' -] -; - -parameter_type_list(struct proto **plp;) - { int save_level; } -: - { if (level > L_PROTO) { - save_level = level; - level = L_PROTO; - } else level--; - } - parameter_decl_list(plp) - [ - ',' ELLIPSIS - { register struct proto *new = new_proto(); - - new->next = *plp; - new->pl_flag = PL_ELLIPSIS; - *plp = new; - } - - ]? - { check_for_void(*plp); - if (level == L_PROTO) - level = save_level; - else level++; - } -; - -parameter_decl_list(struct proto **plp;) -: - parameter_decl(plp) - [ %while (AHEAD != ELLIPSIS) - %persistent - ',' parameter_decl(plp) - ]* -; - -parameter_decl(struct proto **plp;) - { register struct proto *new = new_proto(); - struct declarator Dc; - struct decspecs Ds; - } -: - { Dc = null_declarator; - Ds = null_decspecs; - } - decl_specifiers(&Ds) - parameter_declarator(&Dc) - { add_proto(new, &Ds, &Dc, level); - new->next = *plp; - *plp = new; - remove_declarator(&Dc); - } -; - -/* This is weird. Due to the LR structure of the ANSI C grammar - we have to duplicate the actions of 'declarator' and - 'abstract_declarator'. Calling these separately, as in - - parameter_decl: - decl_specifiers - [ - declarator - | - abstract_declarator - ] - - - gives us a conflict on the terminals '(' and '*'. E.i. on - some input, it is impossible to decide which rule we take. - Combining the two declarators into one common declarator - is out of the question, since this results in an empty - string for the non-terminal 'declarator'. - So we combine the two only for the use of parameter_decl, - since this is the only place where they don't give - conflicts. However, this makes the grammar messy. -*/ -parameter_declarator(register struct declarator *dc;) - { struct formal *fm = NO_PARAMS; - struct proto *pl = NO_PROTO; - arith count; - int qual; - } -: - primary_parameter_declarator(dc) - [ - '(' - [ %if (DOT != IDENTIFIER) - parameter_type_list(&pl) - | - formal_list(&fm) - | - /* empty */ - ] - ')' - { add_decl_unary(dc, FUNCTION, 0, (arith)0, fm, pl); - reject_params(dc); - } - | - arrayer(&count) - {add_decl_unary(dc, ARRAY, 0, count, NO_PARAMS, NO_PROTO);} - ]* -| - pointer(&qual) parameter_declarator(dc) - {add_decl_unary(dc, POINTER, qual, (arith)0, NO_PARAMS, NO_PROTO);} -; - -primary_parameter_declarator(register struct declarator *dc;) -: -[%if (AHEAD == ')' || first_of_parameter_type_list(AHEAD) - && (AHEAD != IDENTIFIER)) - /* empty */ -| - identifier(&dc->dc_idf) -| - '(' parameter_declarator(dc) ')' -] -; - -pointer(int *qual;) -: - '*' type_qualifier_list(qual) -; - -/* Type qualifiers may come in three flavours: - volatile, const, const volatile. - These all have different semantic properties: - - volatile: - means that the object can be modified - without prior knowledge of the implementation. - - const: - means that the object can not be modified; thus - it's illegal to use this as a l-value. - - const volatile: - means that the object can be modified without - prior knowledge of the implementation, but may - not be used as a l-value. -*/ -/* 3.5.4 */ -type_qualifier_list(int *qual;) -: - { *qual = 0; } - [ - VOLATILE - { if (*qual & TQ_VOLATILE) - error("repeated type qualifier"); - *qual |= TQ_VOLATILE; - } - | - CONST - { if (*qual & TQ_CONST) - error("repeated type qualifier"); - *qual |= TQ_CONST; - } - ]* -; - -empty: -; +/* + * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. + * See the copyright notice in the ACK home directory, in the file "Copyright". + */ +/* $Id$ */ +/* DECLARATION SYNTAX PARSER */ + +{ +#include "parameters.h" +#include +#include +#include "idf.h" +#include "arith.h" +#include "LLlex.h" +#include "label.h" +#include "code.h" +#include "type.h" +#include "proto.h" +#include "struct.h" +#include "field.h" +#include "decspecs.h" +#include "declarator.h" +#include "def.h" +#include "declar.h" +#include "label.h" +#include "expr.h" +#include "sizes.h" +#include "level.h" +#include "error.h" +#include "stab.h" + +#ifdef LINT +#include "l_lint.h" +#endif /* LINT */ + +extern char options[]; +} + +/* 3.5 */ +declaration + {struct decspecs Ds;} +: + {Ds = null_decspecs;} + decl_specifiers(&Ds) + init_declarator_list(&Ds)? + ';' +; + +/* A `decl_specifiers' describes a sequence of a storage_class_specifier, + an unsigned_specifier, a size_specifier and a simple type_specifier, + which may occur in arbitrary order and each of which may be absent; + at least one of them must be present, however, since the totally + empty case has already be dealt with in `external_definition'. + This means that something like: + unsigned extern int short xx; + is perfectly legal C. + + On top of that, multiple occurrences of storage_class_specifiers, + unsigned_specifiers and size_specifiers are errors, but a second + type_specifier should end the decl_specifiers and be treated as + the name to be declared. + Such a language is not easily expressed in a grammar; enumeration + of the permutations is unattractive. We solve the problem by + having a regular grammar for the "soft" items, handling the single + occurrence of the type_specifier in the grammar (we have no choice), + collecting all data in a `struct decspecs' and turning that data + structure into what we want. + + The existence of declarations like + short typedef yepp; + makes all hope of writing a specific grammar for typedefs illusory. +*/ +/* Accept a single declaration specifier. Then accept zero or more + declaration specifiers. There can be a conflict on both + TYPE_IDENTIFIER and IDENTIFIER. + The following rule is used: + When we see a TYPE_IDENTIFIER, we accept it if no type-specifier was + given, and it is not directly followed by an identifier. If a + type-specifier was given, it is taken as the identifier being + declared. If it is followed by an identifier, we assume that an + error has been made, (e.g. unsigned typedeffed_int x;) and that + this will be detected later on. + When we see an IDENTIFIER, directly followed by another IDENTIFIER, + we assume that a typing mistake has been made, and we accept it as + an erroneous type-identifier. +*/ + +decl_specifiers /* non-empty */ (register struct decspecs *ds;) + /* Reads a non-empty decl_specifiers and fills the struct + decspecs *ds. + */ +: + single_decl_specifier(ds) + [ %while( (DOT==TYPE_IDENTIFIER + && ds->ds_size == 0 + && ds->ds_unsigned == 0 + && ds->ds_type == (struct type *)0) + || AHEAD == IDENTIFIER) /* always an error */ + single_decl_specifier(ds) + ]* + {do_decspecs(ds);} +; + +single_decl_specifier /* non_empty */ (register struct decspecs *ds;) +: + [ AUTO | STATIC | EXTERN | TYPEDEF | REGISTER ] + { if (ds->ds_sc_given) + error("repeated storage class specifier"); + ds->ds_sc_given = 1; + ds->ds_sc = DOT; + } +| + VOLATILE + { if (ds->ds_typequal & TQ_VOLATILE) + error("repeated type qualifier"); + ds->ds_typequal |= TQ_VOLATILE; + } +| + CONST + { if (ds->ds_typequal & TQ_CONST) + error("repeated type qualifier"); + ds->ds_typequal |= TQ_CONST; + } +| + [ SHORT | LONG ] + { if (ds->ds_size == LONG && DOT == LONG) + ds->ds_size = LNGLNG; + else { + if (ds->ds_size) + error("repeated size specifier"); + ds->ds_size = DOT; + } + } +| + [ SIGNED | UNSIGNED ] + { if (ds->ds_unsigned != 0) + error("repeated sign specifier"); + ds->ds_unsigned = DOT; + } +| + [ VOID | CHAR | INT | FLOAT | DOUBLE ] + { + idf2type(dot.tk_idf, &ds->ds_type); + ds->ds_typedef = 0; + } +| + %default TYPE_IDENTIFIER + { + idf2type(dot.tk_idf, &ds->ds_type); + ds->ds_typedef = 1; + } +| + %erroneous + IDENTIFIER + { + error("%s is not a type identifier", dot.tk_idf->id_text); + ds->ds_type = error_type; + if (dot.tk_idf->id_def) { + dot.tk_idf->id_def->df_type = error_type; + dot.tk_idf->id_def->df_sc = TYPEDEF; + } + } +| + %illegal + IDENTIFIER +| + struct_or_union_specifier(&ds->ds_type) +| + enum_specifier(&ds->ds_type) +; + +/* 3.5.2 */ +type_specifier(struct type **tpp;) + /* Used in struct/union declarations and in casts; only the + type is relevant. + */ + {struct decspecs Ds; Ds = null_decspecs;} +: + decl_specifiers(&Ds) + { + if (Ds.ds_sc_given) + error("storage class ignored"); + if (Ds.ds_sc == REGISTER) + error("register ignored"); + } + {*tpp = Ds.ds_type;} +; + +/* 3.5 */ +init_declarator_list(struct decspecs *ds;): + init_declarator(ds) + [ ',' init_declarator(ds) ]* +; + +init_declarator(register struct decspecs *ds;) + { + struct declarator Dc; + } +: + { + Dc = null_declarator; + } +[ + declarator(&Dc) + { + reject_params(&Dc); + declare_idf(ds, &Dc, level); +#ifdef LINT + lint_declare_idf(Dc.dc_idf, ds->ds_sc); +#endif /* LINT */ + } + [ + initializer(Dc.dc_idf, ds->ds_sc) + | + { code_declaration(Dc.dc_idf, (struct expr *) 0, level, ds->ds_sc); } + ] +] + { +#ifdef LINT + add_auto(Dc.dc_idf); +#endif /* LINT */ + remove_declarator(&Dc); + } +; + +/* 3.5.7: initializer */ +initializer(struct idf *idf; int sc;) + { + struct expr *expr = (struct expr *) 0; + int fund = idf->id_def->df_type->tp_fund; + int autoagg = (level >= L_LOCAL + && sc != STATIC + && ( fund == STRUCT + || fund == UNION + || fund == ARRAY)); + int globalflag = level == L_GLOBAL + || (level >= L_LOCAL && sc == STATIC); + } +: + { if (idf->id_def->df_type->tp_fund == FUNCTION) { + error("illegal initialization of function"); + idf->id_def->df_type->tp_fund = ERRONEOUS; + } + if (level == L_FORMAL2) + error("illegal initialization of formal parameter"); + } + '=' + { + if (AHEAD != '{' && AHEAD != STRING ) autoagg = 0; +#ifdef LINT + lint_statement(); +#endif /* LINT */ + if (globalflag) { + struct expr ex; + code_declaration(idf, &ex, level, sc); + } + else if (autoagg) + loc_init((struct expr *) 0, idf); + } + initial_value((globalflag || autoagg) ? + &(idf->id_def->df_type) + : (struct type **)0, + &expr) + { if (! globalflag) { + if (idf->id_def->df_type->tp_fund == FUNCTION) { + free_expression(expr); + expr = 0; + } +#ifdef DEBUG + print_expr("initializer-expression", expr); +#endif /* DEBUG */ +#ifdef LINT + change_state(idf, SET); +#endif /* LINT */ +#ifdef DBSYMTAB + if (options['g'] && level >= L_LOCAL && expr) { + db_line(expr->ex_file, (unsigned) expr->ex_line); + } +#endif /* DBSYMTAB */ + if (autoagg) + loc_init((struct expr *) 0, idf); + else code_declaration(idf, expr, level, sc); + } +#ifdef DBSYMTAB + if (options['g'] && globalflag) { + stb_string(idf->id_def, sc, idf->id_text); + } +#endif /* DBSYMTAB */ + idf_initialized(idf); + } +; + +/* + Functions yielding pointers to functions must be declared as, e.g., + int (*hehe(par1, par2))() char *par1, *par2; {} + Since the function heading is read as a normal declarator, + we just include the (formal) parameter list in the declarator + description list dc. +*/ +/* 3.5.4 */ +declarator(register struct declarator *dc;) + { struct formal *fm = NO_PARAMS; + struct proto *pl = NO_PROTO; + arith count; + int qual; + } +: + primary_declarator(dc) + [/*%while(1)*/ + '(' + [ %if (DOT != IDENTIFIER) + parameter_type_list(&pl) + | + formal_list(&fm) + | + /* empty */ + ] + ')' + { add_decl_unary(dc, FUNCTION, 0, (arith)0, fm, pl); + fm = NO_PARAMS; + } + | + arrayer(&count) + {add_decl_unary(dc, ARRAY, 0, count, NO_PARAMS, NO_PROTO);} + ]* +| + pointer(&qual) declarator(dc) + {add_decl_unary(dc, POINTER, qual, (arith)0, NO_PARAMS, NO_PROTO);} +; + +primary_declarator(register struct declarator *dc;) : + identifier(&dc->dc_idf) +| + '(' declarator(dc) ')' +; + +arrayer(arith *sizep;) + { struct expr *expr; } +: + '[' + { *sizep = (arith)-1; } + [ + constant_expression(&expr) + { + check_array_subscript(expr); + *sizep = (arith)expr->VL_VALUE; + free_expression(expr); + } + ]? + ']' +; + +formal_list (struct formal **fmp;) +: + formal(fmp) [ %persistent ',' formal(fmp) ]* +; + +formal(struct formal **fmp;) + {struct idf *idf; } +: + identifier(&idf) + { + register struct formal *new = new_formal(); + + new->fm_idf = idf; + new->next = *fmp; + *fmp = new; + if (idf->id_def && idf->id_def->df_sc == TYPEDEF) { + error("typedef name %s may not be redeclared as a parameter", idf->id_text); + } + } +; + +/* Change 2 */ +enum_specifier(register struct type **tpp;) + { + struct idf *idf; + arith l = (arith)0; + } +: + {if (*tpp) error("multiple types in declaration");} + ENUM + [ + {declare_struct(ENUM, (struct idf *) 0, tpp);} + enumerator_pack(*tpp, &l) + | + identifier(&idf) + [ + {declare_struct(ENUM, idf, tpp);} + enumerator_pack(*tpp, &l) + { +#ifdef DBSYMTAB + if (options['g']) { + stb_tag(idf->id_tag, idf->id_text); + } +#endif /*DBSYMTAB */ + } + | + {apply_struct(ENUM, idf, tpp);} + /* empty */ + ] + ] +; + +enumerator_pack(register struct type *tp; arith *lp;) : + '{' + enumerator(tp, lp) + [%while (AHEAD != '}') + ',' + enumerator(tp, lp) + ]* + [ + ',' {warning("unexpected trailing comma in enumerator pack");} + ]? + '}' + {tp->tp_size = int_size;} + /* fancy implementations that put small enums in 1 byte + or so should start here. + */ +; + +enumerator(struct type *tp; arith *lp;) + { + struct idf *idf; + struct expr *expr; + } +: + identifier(&idf) + [ + '=' + constant_expression(&expr) + { + *lp = (arith)expr->VL_VALUE; + free_expression(expr); + } + ]? + {declare_enum(tp, idf, (*lp)++);} +; + +/* 8.5 */ +struct_or_union_specifier(register struct type **tpp;) + { + int fund; + struct idf *idfX; + register struct idf *idf; + } +: + {if (*tpp) error("multiple types in declaration");} + [ STRUCT | UNION ] + {fund = DOT;} + [ + { + declare_struct(fund, (struct idf *)0, tpp); + } + struct_declaration_pack(*tpp) + | + identifier(&idfX) { idf = idfX; } + [ + { + declare_struct(fund, idf, tpp); + (idf->id_tag->tg_busy)++; + } + struct_declaration_pack(*tpp) + { + (idf->id_tag->tg_busy)--; +#ifdef DBSYMTAB + if (options['g']) { + stb_tag(idf->id_tag, idf->id_text); + } +#endif /*DBSYMTAB */ + } + | + { + /* a ';' means an empty declaration (probably) + * this means that we have to declare a new + * structure. (yegh) + */ + if (DOT == ';' && + ( !idf->id_tag || + idf->id_tag->tg_level != level || + idf->id_tag->tg_type->tp_size < 0 + )) declare_struct(fund, idf, tpp); + else apply_struct(fund, idf, tpp); + } + /* empty */ + ] + ] +; + +struct_declaration_pack(register struct type *stp;) + { + struct sdef **sdefp = &stp->tp_sdef; + arith size = (arith)0; + } +: + /* The size is only filled in after the whole struct has + been read, to prevent recursive definitions. + */ + '{' + struct_declaration(stp, &sdefp, &size)+ + '}' + {stp->tp_size = align(size, stp->tp_align); + completed(stp); + } +; + +struct_declaration(struct type *stp; struct sdef ***sdefpp; arith *szp;) + {struct type *tp;} +: + type_specifier(&tp) struct_declarator_list(tp, stp, sdefpp, szp) ';' +; + +struct_declarator_list(struct type *tp; struct type *stp; + struct sdef ***sdefpp; arith *szp;) +: + struct_declarator(tp, stp, sdefpp, szp) + [ ',' struct_declarator(tp, stp, sdefpp, szp) ]* +; + +struct_declarator(struct type *tp; struct type *stp; + struct sdef ***sdefpp; arith *szp;) + { + struct declarator Dc; + struct field *fd = 0; + } +: + { + Dc = null_declarator; + } +[ + declarator(&Dc) + {reject_params(&Dc);} + bit_expression(&fd)? +| + {Dc.dc_idf = gen_idf();} + bit_expression(&fd) +] + {add_sel(stp, declare_type(tp, &Dc), Dc.dc_idf, sdefpp, szp, fd);} + {remove_declarator(&Dc);} +; + +bit_expression(struct field **fd;) + { struct expr *expr; } +: + { + *fd = new_field(); + } + ':' + constant_expression(&expr) + { + (*fd)->fd_width = (arith)expr->VL_VALUE; + free_expression(expr); +#ifdef NOBITFIELD + error("bitfields are not implemented"); +#endif /* NOBITFIELD */ + } +; + +/* 8.7 */ +cast(struct type **tpp;) + {struct declarator Dc;} +: + {Dc = null_declarator;} + '(' + type_specifier(tpp) + abstract_declarator(&Dc) + ')' + {*tpp = declare_type(*tpp, &Dc);} + {remove_declarator(&Dc);} +; + +/* This code is an abject copy of that of 'declarator', for lack of + a two-level grammar. +*/ +abstract_declarator(register struct declarator *dc;) + { struct proto *pl = NO_PROTO; + arith count; + int qual; + } +: + primary_abstract_declarator(dc) + [ + '(' + [ + parameter_type_list(&pl) + | + /* empty */ + ] + ')' + {add_decl_unary(dc, FUNCTION, 0, (arith)0, NO_PARAMS, pl); + if (pl) remove_proto_idfs(pl); + } + | + arrayer(&count) + {add_decl_unary(dc, ARRAY, 0, count, NO_PARAMS, NO_PROTO);} + ]* +| + pointer(&qual) abstract_declarator(dc) + {add_decl_unary(dc, POINTER, qual, (arith)0, NO_PARAMS, NO_PROTO);} +; + +%first first_of_parameter_type_list, parameter_type_list; + +primary_abstract_declarator(struct declarator *dc;) +: +[%if (AHEAD == ')' || first_of_parameter_type_list(AHEAD)) + /* empty */ +| + '(' abstract_declarator(dc) ')' +] +; + +parameter_type_list(struct proto **plp;) + { int save_level; } +: + { if (level > L_PROTO) { + save_level = level; + level = L_PROTO; + } else level--; + } + parameter_decl_list(plp) + [ + ',' ELLIPSIS + { register struct proto *new = new_proto(); + + new->next = *plp; + new->pl_flag = PL_ELLIPSIS; + *plp = new; + } + + ]? + { check_for_void(*plp); + if (level == L_PROTO) + level = save_level; + else level++; + } +; + +parameter_decl_list(struct proto **plp;) +: + parameter_decl(plp) + [ %while (AHEAD != ELLIPSIS) + %persistent + ',' parameter_decl(plp) + ]* +; + +parameter_decl(struct proto **plp;) + { register struct proto *new = new_proto(); + struct declarator Dc; + struct decspecs Ds; + } +: + { Dc = null_declarator; + Ds = null_decspecs; + } + decl_specifiers(&Ds) + parameter_declarator(&Dc) + { add_proto(new, &Ds, &Dc, level); + new->next = *plp; + *plp = new; + remove_declarator(&Dc); + } +; + +/* This is weird. Due to the LR structure of the ANSI C grammar + we have to duplicate the actions of 'declarator' and + 'abstract_declarator'. Calling these separately, as in + + parameter_decl: + decl_specifiers + [ + declarator + | + abstract_declarator + ] + + + gives us a conflict on the terminals '(' and '*'. E.i. on + some input, it is impossible to decide which rule we take. + Combining the two declarators into one common declarator + is out of the question, since this results in an empty + string for the non-terminal 'declarator'. + So we combine the two only for the use of parameter_decl, + since this is the only place where they don't give + conflicts. However, this makes the grammar messy. +*/ +parameter_declarator(register struct declarator *dc;) + { struct formal *fm = NO_PARAMS; + struct proto *pl = NO_PROTO; + arith count; + int qual; + } +: + primary_parameter_declarator(dc) + [ + '(' + [ %if (DOT != IDENTIFIER) + parameter_type_list(&pl) + | + formal_list(&fm) + | + /* empty */ + ] + ')' + { add_decl_unary(dc, FUNCTION, 0, (arith)0, fm, pl); + reject_params(dc); + } + | + arrayer(&count) + {add_decl_unary(dc, ARRAY, 0, count, NO_PARAMS, NO_PROTO);} + ]* +| + pointer(&qual) parameter_declarator(dc) + {add_decl_unary(dc, POINTER, qual, (arith)0, NO_PARAMS, NO_PROTO);} +; + +primary_parameter_declarator(register struct declarator *dc;) +: +[%if (AHEAD == ')' || first_of_parameter_type_list(AHEAD) + && (AHEAD != IDENTIFIER)) + /* empty */ +| + identifier(&dc->dc_idf) +| + '(' parameter_declarator(dc) ')' +] +; + +pointer(int *qual;) +: + '*' type_qualifier_list(qual) +; + +/* Type qualifiers may come in three flavours: + volatile, const, const volatile. + These all have different semantic properties: + + volatile: + means that the object can be modified + without prior knowledge of the implementation. + + const: + means that the object can not be modified; thus + it's illegal to use this as a l-value. + + const volatile: + means that the object can be modified without + prior knowledge of the implementation, but may + not be used as a l-value. +*/ +/* 3.5.4 */ +type_qualifier_list(int *qual;) +: + { *qual = 0; } + [ + VOLATILE + { if (*qual & TQ_VOLATILE) + error("repeated type qualifier"); + *qual |= TQ_VOLATILE; + } + | + CONST + { if (*qual & TQ_CONST) + error("repeated type qualifier"); + *qual |= TQ_CONST; + } + ]* +; + +empty: +; diff --git a/lang/cem/cemcom.ansi/expression.g b/lang/cem/cemcom.ansi/expression.g index 0998883c1..06bd74bc1 100644 --- a/lang/cem/cemcom.ansi/expression.g +++ b/lang/cem/cemcom.ansi/expression.g @@ -1,354 +1,354 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* $Id$ */ -/* EXPRESSION SYNTAX PARSER */ - -{ -#include -#include "parameters.h" -#include -#include "arith.h" -#include "LLlex.h" -#include "type.h" -#include "label.h" -#include "expr.h" -#include "code.h" -#include "error.h" -#include "ch3.h" -#include "ch3bin.h" -#include "ch3mon.h" -#include "proto.h" -#include "sizes.h" - -extern struct expr *intexpr(); -int InSizeof = 0; /* inside a sizeof- expression */ -int ResultKnown = 0; /* result of the expression is already known */ - -/* Since the grammar in the standard is not LL(n), it is modified so that - * it accepts basically the same grammar. This means that there is no 1-1 - * mapping from the grammar in the standard to the grammar given here. - * Such is life. - */ -} - -/* 3.3.1 */ -primary(register struct expr **expp;) : - IDENTIFIER - {dot2expr(expp);} -| - constant(expp) -| - string(expp) -| - '(' expression(expp) ')' - { (*expp)->ex_flags |= EX_PARENS; } -; - - -/* Character string literals that are adjacent tokens - * are concatenated into a single character string - * literal. - */ -string(register struct expr **expp;) - { register int i, len; - register char *str; - register int fund; - } -: - STRING - { str = dot.tk_bts; - len = dot.tk_len; - fund = dot.tk_fund; - } - [ - STRING - { /* A pasted string keeps the type of the first - * string literal. - * The pasting of normal strings and wide - * character strings are stated as having an - * undefined behaviour. - */ - if (dot.tk_fund != fund) - warning("illegal pasting of string literals"); - str = Realloc(str, (unsigned) (--len + dot.tk_len)); - for (i = 0; i < dot.tk_len; i++) - str[len++] = dot.tk_bts[i]; - } - ]* - { string2expr(expp, str, len); } -; - -/* 3.3.2 */ -postfix_expression(register struct expr **expp;) - { int oper; - struct expr *e1 = 0; - struct idf *idf; - } -: - primary(expp) - [ - '[' expression(&e1) ']' - { ch3bin(expp, '[', e1); e1 = 0; } - | - '(' parameter_list(&e1)? ')' - { ch3bin(expp, '(', e1); call_proto(expp); e1 = 0; } - | - [ '.' | ARROW ] { oper = DOT; } - identifier(&idf) { ch3sel(expp, oper, idf); } - | - [ - PLUSPLUS { oper = POSTINCR; } - | - MINMIN { oper = POSTDECR; } - ] - { ch3incr(expp, oper); } - ]* -; - -parameter_list(struct expr **expp;) - {struct expr *e1 = 0;} -: - assignment_expression(expp) - {any2opnd(expp, PARCOMMA);} - [ %persistent - ',' - assignment_expression(&e1) - {any2opnd(&e1, PARCOMMA);} - {ch3bin(expp, PARCOMMA, e1);} - ]* -; - -%first first_of_type_specifier, type_specifier; - -/* 3.3.3 & 3.3.4 */ -unary(register struct expr **expp;) - {struct type *tp; int oper;} -: -%if (first_of_type_specifier(AHEAD) && AHEAD != IDENTIFIER) - cast(&tp) unary(expp) - { ch3cast(expp, CAST, tp); - (*expp)->ex_flags |= EX_CAST; - if (int_size != pointer_size) - (*expp)->ex_flags &= ~EX_PTRDIFF; - } -| - postfix_expression(expp) -| - unop(&oper) unary(expp) - {ch3mon(oper, expp);} -| - size_of(expp) -; - -/* When an identifier is used in a sizeof()-expression, we must stil not - * mark it as used. - * extern int i; .... sizeof(i) .... need not have a definition for i - */ -size_of(register struct expr **expp;) - {struct type *tp;} -: - SIZEOF { InSizeof++; } /* handle (sizeof(sizeof(int))) too */ - [%if (first_of_type_specifier(AHEAD) && AHEAD != IDENTIFIER) - cast(&tp) - { - *expp = intexpr(size_of_type(tp, "type"), UNSIGNED); - (*expp)->ex_flags |= EX_SIZEOF; - } - | - unary(expp) - {ch3mon(SIZEOF, expp);} - ] - { InSizeof--; } -; - -/* 3.3.5-3.3.17 */ -/* The set of operators in C is stratified in 15 levels, with level - N being treated in RM 7.N (although this is not the standard - anymore). The standard describes this in phrase-structure-grammar, - which we are unable to parse. The description that follows comes - from the old C-compiler. - - In principle each operator is assigned a rank, ranging - from 1 to 15. Such an expression can be parsed by a construct - like: - binary_expression(int maxrank;) - {int oper;} - : - binary_expression(maxrank - 1) - [%if (rank_of(DOT) <= maxrank) - binop(&oper) - binary_expression(rank_of(oper)-1) - ]? - ; - except that some call of 'unary' is necessary, depending on the - grammar. - - This simple view is marred by three complications: - 1. Level 15 (comma operator) is not allowed in many - contexts and is different. - 2. Level 13 (conditional operator) is a ternary operator, - which does not fit this scheme at all. - 3. Level 14 (assignment operators) group right-to-left, as - opposed to 2-12, which group left-to-right (or are - immaterial). - 4. The operators in level 14 start with operators in levels - 2-13 (RM 7.14: The two parts of a compound assignment - operator are separate tokens.) This causes LL1 problems. - This forces us to have four rules: - binary_expression for level 2-12 - conditional_expression for level 13 - assignment_expression for level 14 and - expression for the most general expression -*/ - -binary_expression(int maxrank; struct expr **expp;) - {int oper, OldResultKnown; struct expr *e1;} -: - unary(expp) - [%while (rank_of(DOT) <= maxrank ) - /* '?', '=', and ',' are no binops - */ - binop(&oper) - { OldResultKnown = ResultKnown; - if (oper == OR || oper == AND) { - if (is_cp_cst(*expp) || is_fp_cst(*expp)) { - if (is_zero_cst(*expp)) { - if (oper == AND) ResultKnown++; - } else if (oper == OR) ResultKnown++; - } - } - } - binary_expression(rank_of(oper)-1, &e1) - { - ch3bin(expp, oper, e1); - ResultKnown = OldResultKnown; - } - ]* -; - -/* 3.3.15 */ -conditional_expression(struct expr **expp;) - {struct expr *e1 = 0, *e2 = 0; int OldResultKnown, ConstExpr=0;} -: - /* allow all binary operators */ - binary_expression(rank_of('?') - 1, expp) - [ '?' - { OldResultKnown = ResultKnown; - if (is_cp_cst(*expp) || is_fp_cst(*expp)) { - ConstExpr++; - if (is_zero_cst(*expp)) ResultKnown++; - } - } - expression(&e1) - ':' - { if (ConstExpr) { - if (OldResultKnown == ResultKnown) ResultKnown++; - else ResultKnown = OldResultKnown; - } - } - conditional_expression(&e2) - { - ResultKnown = OldResultKnown; - ch3bin(&e1, ':', e2); - opnd2test(expp, '?'); - ch3bin(expp, '?', e1); - } - ]? -; - -/* 3.3.16 */ -assignment_expression(struct expr **expp;) - { int oper; - struct expr *e1 = 0; - } -: - conditional_expression(expp) - [ - asgnop(&oper) - assignment_expression(&e1) - {ch3asgn(expp, oper, e1);} - | - empty /* LLgen artefact ??? */ - ] -; - -/* 3.3.17 */ -expression(struct expr **expp;) - {struct expr *e1;} -: - assignment_expression(expp) - [ ',' - assignment_expression(&e1) - { - ch3bin(expp, ',', e1); - } - ]* -; - -unop(int *oper;) : - ['*' | '&' | '-' | '+' | '!' | '~' | PLUSPLUS | MINMIN] - { if (DOT == '&') DOT = ADDRESSOF; - *oper = DOT; - } -; - -multop: - '*' | '/' | '%' -; - -addop: - '+' | '-' -; - -shiftop: - LEFT | RIGHT -; - -relop: - '<' | '>' | LESSEQ | GREATEREQ -; - -eqop: - EQUAL | NOTEQUAL -; - -arithop: - multop | addop | shiftop -| - '&' | '^' | '|' -; - -binop(int *oper;) : - [ arithop | relop | eqop | AND | OR ] - {*oper = DOT;} -; - -asgnop(register int *oper;): - [ '=' | PLUSAB | MINAB | TIMESAB | DIVAB | MODAB - | LEFTAB | RIGHTAB | ANDAB | XORAB | ORAB ] - { *oper = DOT; } - -; - -constant(struct expr **expp;) : -[ - INTEGER -| - FLOATING -] {dot2expr(expp);} -; - -/* 3.4 */ -constant_expression (struct expr **expp;) : - conditional_expression(expp) - { chk_cst_expr(expp); } -; - -identifier(struct idf **idfp;) : -[ IDENTIFIER -| TYPE_IDENTIFIER -] - { *idfp = dot.tk_idf; } -; +/* + * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. + * See the copyright notice in the ACK home directory, in the file "Copyright". + */ +/* $Id$ */ +/* EXPRESSION SYNTAX PARSER */ + +{ +#include +#include "parameters.h" +#include +#include "arith.h" +#include "LLlex.h" +#include "type.h" +#include "label.h" +#include "expr.h" +#include "code.h" +#include "error.h" +#include "ch3.h" +#include "ch3bin.h" +#include "ch3mon.h" +#include "proto.h" +#include "sizes.h" + +extern struct expr *intexpr(); +int InSizeof = 0; /* inside a sizeof- expression */ +int ResultKnown = 0; /* result of the expression is already known */ + +/* Since the grammar in the standard is not LL(n), it is modified so that + * it accepts basically the same grammar. This means that there is no 1-1 + * mapping from the grammar in the standard to the grammar given here. + * Such is life. + */ +} + +/* 3.3.1 */ +primary(register struct expr **expp;) : + IDENTIFIER + {dot2expr(expp);} +| + constant(expp) +| + string(expp) +| + '(' expression(expp) ')' + { (*expp)->ex_flags |= EX_PARENS; } +; + + +/* Character string literals that are adjacent tokens + * are concatenated into a single character string + * literal. + */ +string(register struct expr **expp;) + { register int i, len; + register char *str; + register int fund; + } +: + STRING + { str = dot.tk_bts; + len = dot.tk_len; + fund = dot.tk_fund; + } + [ + STRING + { /* A pasted string keeps the type of the first + * string literal. + * The pasting of normal strings and wide + * character strings are stated as having an + * undefined behaviour. + */ + if (dot.tk_fund != fund) + warning("illegal pasting of string literals"); + str = Realloc(str, (unsigned) (--len + dot.tk_len)); + for (i = 0; i < dot.tk_len; i++) + str[len++] = dot.tk_bts[i]; + } + ]* + { string2expr(expp, str, len); } +; + +/* 3.3.2 */ +postfix_expression(register struct expr **expp;) + { int oper; + struct expr *e1 = 0; + struct idf *idf; + } +: + primary(expp) + [ + '[' expression(&e1) ']' + { ch3bin(expp, '[', e1); e1 = 0; } + | + '(' parameter_list(&e1)? ')' + { ch3bin(expp, '(', e1); call_proto(expp); e1 = 0; } + | + [ '.' | ARROW ] { oper = DOT; } + identifier(&idf) { ch3sel(expp, oper, idf); } + | + [ + PLUSPLUS { oper = POSTINCR; } + | + MINMIN { oper = POSTDECR; } + ] + { ch3incr(expp, oper); } + ]* +; + +parameter_list(struct expr **expp;) + {struct expr *e1 = 0;} +: + assignment_expression(expp) + {any2opnd(expp, PARCOMMA);} + [ %persistent + ',' + assignment_expression(&e1) + {any2opnd(&e1, PARCOMMA);} + {ch3bin(expp, PARCOMMA, e1);} + ]* +; + +%first first_of_type_specifier, type_specifier; + +/* 3.3.3 & 3.3.4 */ +unary(register struct expr **expp;) + {struct type *tp; int oper;} +: +%if (first_of_type_specifier(AHEAD) && AHEAD != IDENTIFIER) + cast(&tp) unary(expp) + { ch3cast(expp, CAST, tp); + (*expp)->ex_flags |= EX_CAST; + if (int_size != pointer_size) + (*expp)->ex_flags &= ~EX_PTRDIFF; + } +| + postfix_expression(expp) +| + unop(&oper) unary(expp) + {ch3mon(oper, expp);} +| + size_of(expp) +; + +/* When an identifier is used in a sizeof()-expression, we must stil not + * mark it as used. + * extern int i; .... sizeof(i) .... need not have a definition for i + */ +size_of(register struct expr **expp;) + {struct type *tp;} +: + SIZEOF { InSizeof++; } /* handle (sizeof(sizeof(int))) too */ + [%if (first_of_type_specifier(AHEAD) && AHEAD != IDENTIFIER) + cast(&tp) + { + *expp = intexpr(size_of_type(tp, "type"), UNSIGNED); + (*expp)->ex_flags |= EX_SIZEOF; + } + | + unary(expp) + {ch3mon(SIZEOF, expp);} + ] + { InSizeof--; } +; + +/* 3.3.5-3.3.17 */ +/* The set of operators in C is stratified in 15 levels, with level + N being treated in RM 7.N (although this is not the standard + anymore). The standard describes this in phrase-structure-grammar, + which we are unable to parse. The description that follows comes + from the old C-compiler. + + In principle each operator is assigned a rank, ranging + from 1 to 15. Such an expression can be parsed by a construct + like: + binary_expression(int maxrank;) + {int oper;} + : + binary_expression(maxrank - 1) + [%if (rank_of(DOT) <= maxrank) + binop(&oper) + binary_expression(rank_of(oper)-1) + ]? + ; + except that some call of 'unary' is necessary, depending on the + grammar. + + This simple view is marred by three complications: + 1. Level 15 (comma operator) is not allowed in many + contexts and is different. + 2. Level 13 (conditional operator) is a ternary operator, + which does not fit this scheme at all. + 3. Level 14 (assignment operators) group right-to-left, as + opposed to 2-12, which group left-to-right (or are + immaterial). + 4. The operators in level 14 start with operators in levels + 2-13 (RM 7.14: The two parts of a compound assignment + operator are separate tokens.) This causes LL1 problems. + This forces us to have four rules: + binary_expression for level 2-12 + conditional_expression for level 13 + assignment_expression for level 14 and + expression for the most general expression +*/ + +binary_expression(int maxrank; struct expr **expp;) + {int oper, OldResultKnown; struct expr *e1;} +: + unary(expp) + [%while (rank_of(DOT) <= maxrank ) + /* '?', '=', and ',' are no binops + */ + binop(&oper) + { OldResultKnown = ResultKnown; + if (oper == OR || oper == AND) { + if (is_cp_cst(*expp) || is_fp_cst(*expp)) { + if (is_zero_cst(*expp)) { + if (oper == AND) ResultKnown++; + } else if (oper == OR) ResultKnown++; + } + } + } + binary_expression(rank_of(oper)-1, &e1) + { + ch3bin(expp, oper, e1); + ResultKnown = OldResultKnown; + } + ]* +; + +/* 3.3.15 */ +conditional_expression(struct expr **expp;) + {struct expr *e1 = 0, *e2 = 0; int OldResultKnown, ConstExpr=0;} +: + /* allow all binary operators */ + binary_expression(rank_of('?') - 1, expp) + [ '?' + { OldResultKnown = ResultKnown; + if (is_cp_cst(*expp) || is_fp_cst(*expp)) { + ConstExpr++; + if (is_zero_cst(*expp)) ResultKnown++; + } + } + expression(&e1) + ':' + { if (ConstExpr) { + if (OldResultKnown == ResultKnown) ResultKnown++; + else ResultKnown = OldResultKnown; + } + } + conditional_expression(&e2) + { + ResultKnown = OldResultKnown; + ch3bin(&e1, ':', e2); + opnd2test(expp, '?'); + ch3bin(expp, '?', e1); + } + ]? +; + +/* 3.3.16 */ +assignment_expression(struct expr **expp;) + { int oper; + struct expr *e1 = 0; + } +: + conditional_expression(expp) + [ + asgnop(&oper) + assignment_expression(&e1) + {ch3asgn(expp, oper, e1);} + | + empty /* LLgen artefact ??? */ + ] +; + +/* 3.3.17 */ +expression(struct expr **expp;) + {struct expr *e1;} +: + assignment_expression(expp) + [ ',' + assignment_expression(&e1) + { + ch3bin(expp, ',', e1); + } + ]* +; + +unop(int *oper;) : + ['*' | '&' | '-' | '+' | '!' | '~' | PLUSPLUS | MINMIN] + { if (DOT == '&') DOT = ADDRESSOF; + *oper = DOT; + } +; + +multop: + '*' | '/' | '%' +; + +addop: + '+' | '-' +; + +shiftop: + LEFT | RIGHT +; + +relop: + '<' | '>' | LESSEQ | GREATEREQ +; + +eqop: + EQUAL | NOTEQUAL +; + +arithop: + multop | addop | shiftop +| + '&' | '^' | '|' +; + +binop(int *oper;) : + [ arithop | relop | eqop | AND | OR ] + {*oper = DOT;} +; + +asgnop(register int *oper;): + [ '=' | PLUSAB | MINAB | TIMESAB | DIVAB | MODAB + | LEFTAB | RIGHTAB | ANDAB | XORAB | ORAB ] + { *oper = DOT; } + +; + +constant(struct expr **expp;) : +[ + INTEGER +| + FLOATING +] {dot2expr(expp);} +; + +/* 3.4 */ +constant_expression (struct expr **expp;) : + conditional_expression(expp) + { chk_cst_expr(expp); } +; + +identifier(struct idf **idfp;) : +[ IDENTIFIER +| TYPE_IDENTIFIER +] + { *idfp = dot.tk_idf; } +; diff --git a/lang/cem/cemcom.ansi/ival.g b/lang/cem/cemcom.ansi/ival.g index 05fcc4881..2e9d3d878 100644 --- a/lang/cem/cemcom.ansi/ival.g +++ b/lang/cem/cemcom.ansi/ival.g @@ -1,760 +1,760 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* $Id$ */ -/* CODE FOR THE INITIALISATION OF GLOBAL VARIABLES */ - -{ -#include -#include -#include "parameters.h" -#ifndef LINT -#include -#else -#include "l_em.h" -#include "l_lint.h" -#endif /* LINT */ -#include -#include -#include -#include -#include -#include "idf.h" -#include "arith.h" -#include "label.h" -#include "expr.h" -#include "type.h" -#include "proto.h" -#include "struct.h" -#include "field.h" -#include "Lpars.h" -#include "sizes.h" -#include "align.h" -#include "level.h" -#include "error.h" -#include "def.h" -#include "LLlex.h" -#include "estack.h" -#include "stack.h" -#include "ch3.h" - -#define con_nullbyte() C_con_ucon("0", (arith)1) -#define aggregate_type(tp) ((tp)->tp_fund == ARRAY || (tp)->tp_fund == STRUCT) - -extern char options[]; -static int gen_error; -static int pack_level; -struct e_stack *p_stack; - -void gen_tpcheck(struct type **); -void gen_simple_exp(struct type **, struct expr **); -struct type **arr_elem(struct type **, struct e_stack *); -struct sdef *next_field(register struct sdef *,register struct e_stack *); -struct type **gen_tphead(struct type **, int); -struct type **gen_tpmiddle(void); -struct sdef *gen_align_to_next(register struct e_stack *); -void gen_tpend(void); -void check_and_pad(struct expr **, struct type **); -void pad(struct type *); -void check_ival(struct expr **, register struct type *); -void ch_array(struct type **, /* type tp = array of characters */ - struct expr *); -void str_cst(register char *, register int, int); -#ifndef NOBITFIELD -void put_bf(struct type *, arith ); -#endif /* NOBITFIELD */ -int zero_bytes(register struct sdef *); -int valid_type(struct type *, char *); -void con_int(register struct expr *); -void illegal_init_cst(struct expr *); -void too_many_initialisers(void); - -} - -/* initial_value recursively guides the initialisation expression. - */ -/* 3.5 */ - -initial_value(register struct type **tpp; register struct expr **expp;) : - { if (tpp) gen_tpcheck(tpp); } -[ - { if (pack_level == 0) gen_error = 0; } - assignment_expression(expp) - { -#ifdef LINT - lint_expr(*expp, USED); -#endif /* LINT */ - if ((*expp)->ex_type->tp_fund == ARRAY) - array2pointer(*expp); - if (tpp) { - if (level >= L_LOCAL - || is_ld_cst(*expp) - || is_fp_cst(*expp) - || (*expp)->ex_class == String) { - gen_simple_exp(tpp, expp); - free_expression(*expp); - *expp = 0; - } else { - expr_error(*expp,"illegal initialization"); - free_expression(*expp); - *expp = 0; - } - } - } -| - initial_value_pack(tpp, expp) -] -; - -initial_value_pack(struct type **tpp; struct expr **expp;) -: - '{' - { if (pack_level == 0) gen_error = 0; pack_level++; } - initial_value_list(tpp, expp) - { pack_level--; - if (!pack_level) { - while (p_stack) { - struct e_stack *p = p_stack->next; - - free_e_stack(p_stack); - p_stack = p; - } - } - if (pack_level < gen_error) gen_error = 0; - } - '}' -; - -initial_value_list(register struct type **tpp; struct expr **expp;) - { struct expr *e1; - register struct type **tpp2 = 0; - int err_flag = gen_error; - } -: - { if (tpp) tpp2 = gen_tphead(tpp, 0); } - initial_value(tpp2, &e1) - { if (!tpp) init_expression(&expp, e1); } - [%while (AHEAD != '}') /* >>> conflict on ',' */ - ',' - { if (tpp) tpp2 = gen_tpmiddle(); } - initial_value(tpp2, &e1) - { if (!tpp) init_expression(&expp, e1); } - ]* - { if (tpp && ! err_flag) gen_tpend(); } - ','? /* optional trailing comma */ -; - -{ -void gen_tpcheck(struct type **tpp) -{ - register struct type *tp; - - if (gen_error) return; - switch((tp = *tpp)->tp_fund) { - case ARRAY: - if (! valid_type(tp->tp_up, "array element")) - gen_error = pack_level; - break; - case STRUCT: - if (! valid_type(tp, "struct")) - gen_error = pack_level; - break; - case UNION: - if (! valid_type(tp, "union")) - gen_error = pack_level; - break; - case ERRONEOUS: - if (! gen_error) gen_error = pack_level; - break; - } -} - -void gen_simple_exp(struct type **tpp, struct expr **expp) -{ - register struct type *tp; - - if (gen_error) return; - tp = *tpp; - switch(tp->tp_fund) { - case ARRAY: - if ((*expp)->ex_class == String && tp->tp_up->tp_fund == CHAR) { - ch_array(tpp,*expp); - break; - } - /* Fall through */ - case UNION: - case STRUCT: - check_and_pad(expp, tpp); - break; - case ERRONEOUS: - case FUNCTION: - case VOID: - gen_error = pack_level; - break; - default: - check_ival(expp, tp); - break; - } -} - -struct type **arr_elem(struct type **tpp, struct e_stack *p) -{ - register struct type *tp = *tpp; - - if (tp->tp_up->tp_fund == CHAR && AHEAD == STRING && p->elem_count == 1) { - p->nelem = 1; - return tpp; - } - if (AHEAD == '{' || (! aggregate_type(tp->tp_up) && tp->tp_up->tp_fund != UNION)) - return &(tp->tp_up); - return gen_tphead(&(tp->tp_up), 1); -} - -struct sdef *next_field(register struct sdef *sd, - register struct e_stack *p) -{ - if (sd->sd_sdef) - p->bytes_upto_here += zero_bytes(sd); - p->bytes_upto_here += - size_of_type(sd->sd_type, "selector"); - p->last_offset = sd->sd_offset; - return sd->sd_sdef; -} - -struct type **gen_tphead(struct type **tpp, int nest) -{ - register struct type *tp = *tpp; - register struct e_stack *p; - register struct sdef *sd; - - if (tpp && *tpp == error_type) { - gen_error = pack_level; - return 0; - } - if (gen_error) return tpp; - if (tp->tp_fund == UNION) { - /* Here, we saw a {, which could be the start of a union - initializer. It could, however, also be the start of the - initializer for the first union field ... - */ - sd = tp->tp_sdef; - if (AHEAD != '{' && - (aggregate_type(sd->sd_type) || - sd->sd_type->tp_fund == UNION)) { - /* In this case, assume that it is the start of the - initializer of the union field, so: - */ - return gen_tphead(&(tp->tp_sdef->sd_type), nest); - } - } - p = new_e_stack(); - p->next = p_stack; - p_stack = p; - p->s_nested = nest; - p->s_tpp = tpp; - switch(tp->tp_fund) { - case UNION: - p->s_def = sd = tp->tp_sdef; - p->bytes_upto_here = 0; - return &(sd->sd_type); - case ARRAY: - p->nelem = -1; - p->elem_count = 1; - if (tp->tp_size != (arith) -1) { - p->nelem = (tp->tp_size / tp->tp_up->tp_size); - } - return arr_elem(tpp, p); - case STRUCT: - p->s_def = sd = tp->tp_sdef; - p->bytes_upto_here = 0; - p->last_offset = -1; -#ifndef NOBITFIELD - while (sd && is_anon_idf(sd->sd_idf)) { - put_bf(sd->sd_type, (arith) 0); - sd = next_field(sd, p); - } -#endif - if (! sd) { - /* something wrong with this struct */ - gen_error = pack_level; - p_stack = p->next; - free_e_stack(p); - return 0; - } - p->s_def = sd; - if (AHEAD != '{' && aggregate_type(sd->sd_type)) { - return gen_tphead(&(sd->sd_type), 1); - } - return &(sd->sd_type); - case ERRONEOUS: - if (! gen_error) gen_error = pack_level; - /* fall through */ - default: - p->nelem = 1; - p->elem_count = 1; - return tpp; - } -} - -struct type **gen_tpmiddle(void) -{ - register struct type *tp; - register struct sdef *sd; - register struct e_stack *p = p_stack; - - if (gen_error) { - if (p) return p->s_tpp; - return 0; - } -again: - tp = *(p->s_tpp); - switch(tp->tp_fund) { - case ERRONEOUS: - if (! gen_error) gen_error = pack_level; - return p->s_tpp; - case UNION: - sd = p->s_def; - p->bytes_upto_here += - size_of_type(sd->sd_type, "selector"); - return p->s_tpp; - default: - if (p->elem_count == p->nelem && p->s_nested) { - p = p->next; - free_e_stack(p_stack); - p_stack = p; - goto again; - } - p->elem_count++; - if (p->nelem >= 0 && p->elem_count > p->nelem) { - too_many_initialisers(); - return p->s_tpp; - } - if (tp->tp_fund == ARRAY) { - return arr_elem(p->s_tpp, p); - } - return p->s_tpp; - case STRUCT: - sd = gen_align_to_next(p); - if (! sd) { - while (p->bytes_upto_here++ < tp->tp_size) - con_nullbyte(); - if (p->s_nested) { - p = p->next; - free_e_stack(p_stack); - p_stack = p; - goto again; - } - too_many_initialisers(); - return p->s_tpp; - } - if (AHEAD != '{' && aggregate_type(sd->sd_type)) { - return gen_tphead(&(sd->sd_type), 1); - } - return &(sd->sd_type); - } -} - -struct sdef *gen_align_to_next(register struct e_stack *p) -{ - register struct sdef *sd = p->s_def; - - if (! sd) return sd; -#ifndef NOBITFIELD - do { - if (is_anon_idf(sd->sd_idf)) put_bf(sd->sd_type, (arith) 0); -#endif - sd = next_field(sd, p); -#ifndef NOBITFIELD - } while (sd && is_anon_idf(sd->sd_idf)); -#endif - p->s_def = sd; - return sd; -} - -void gen_tpend(void) -{ - register struct e_stack *p = p_stack; - register struct type *tp; - register struct sdef *sd; - int getout = 0; - - while (!getout && p) { - if (!gen_error) { - tp = *(p->s_tpp); - switch(tp->tp_fund) { - case UNION: - sd = p->s_def; - p->bytes_upto_here += - size_of_type(sd->sd_type, "selector"); - while (p->bytes_upto_here++ < tp->tp_size) - con_nullbyte(); - break; - case ARRAY: - if (tp->tp_size == -1) { - *(p->s_tpp) = construct_type(ARRAY, tp->tp_up, - 0, p->elem_count, NO_PROTO); - } - else { - while (p->nelem-- > p->elem_count) { - pad(tp->tp_up); - } - } - break; - case STRUCT: - sd = gen_align_to_next(p); - while (sd) { - pad(sd->sd_type); - if (sd->sd_sdef) - p->bytes_upto_here += zero_bytes(sd); - p->bytes_upto_here += - size_of_type(sd->sd_type, "selector"); - sd = sd->sd_sdef; - } - while (p->bytes_upto_here++ < tp->tp_size) - con_nullbyte(); - break; - } - } - if (! p->s_nested) getout = 1; - p = p->next; - free_e_stack(p_stack); - p_stack = p; - } -} - -/* check_and_pad() is given a simple initialisation expression - where the type can be either a simple or an aggregate type. - In the latter case, only the first member is initialised and - the rest is zeroed. -*/ -void check_and_pad(struct expr **expp, struct type **tpp) -{ - register struct type *tp = *tpp; - - if (tp->tp_fund == ARRAY) { - check_and_pad(expp, &(tp->tp_up)); /* first member */ - if (tp->tp_size == (arith)-1) - /* no size specified upto here: just - set it to the size of one member. - */ - tp = *tpp = construct_type(ARRAY, tp->tp_up, - 0, (arith)1, NO_PROTO); - else { - register int dim = tp->tp_size / tp->tp_up->tp_size; - /* pad remaining members with zeroes */ - while (--dim > 0) - pad(tp->tp_up); - } - } - else - if (tp->tp_fund == STRUCT) { - register struct sdef *sd = tp->tp_sdef; - - check_and_pad(expp, &(sd->sd_type)); - /* next selector is aligned by adding extra zeroes */ - if (sd->sd_sdef) - zero_bytes(sd); - while ( (sd = sd->sd_sdef)!=0) { /* pad remaining selectors */ - pad(sd->sd_type); - if (sd->sd_sdef) - zero_bytes(sd); - } - } - else if (tp->tp_fund == UNION) { - /* only the first selector can be initialized */ - register struct sdef *sd = tp->tp_sdef; - - check_and_pad(expp, &(sd->sd_type)); - } - else /* simple type */ - check_ival(expp, tp); -} - -/* pad() fills an element of type tp with zeroes. - If the element is an aggregate, pad() is called recursively. -*/ -void pad(struct type *tpx) -{ - register struct type *tp = tpx; - register arith sz = tp->tp_size; - - gen_tpcheck(&tpx); - if (gen_error) return; -#ifndef NOBITFIELD - if (tp->tp_fund == FIELD) { - put_bf(tp, (arith)0); - return; - } -#endif /* NOBITFIELD */ - - if (tp->tp_align >= word_align) while (sz >= word_size) { - C_con_cst((arith) 0); - sz -= word_size; - } - while (sz) { - C_con_icon("0", (arith) 1); - sz--; - } -} - -/* check_ival() checks whether the initialisation of an element - of a fundamental type is legal and, if so, performs the initialisation - by directly generating the necessary code. - No further comment is needed to explain the internal structure - of this straightforward function. -*/ -void check_ival(struct expr **expp, register struct type *tp) -{ - /* The philosophy here is that ch3cast puts an explicit - conversion node in front of the expression if the types - are not compatible. In this case, the initialisation - expression is no longer a constant. - */ - register struct expr *expr = *expp; - - switch (tp->tp_fund) { - case CHAR: - case SHORT: - case INT: - case LONG: - case LNGLNG: - case ENUM: - case POINTER: - ch3cast(expp, '=', tp); - expr = *expp; -#ifdef DEBUG - print_expr("init-expr after cast", expr); -#endif /* DEBUG */ - if (!is_ld_cst(expr)) - illegal_init_cst(expr); - else - if (expr->VL_CLASS == Const) - con_int(expr); - else - if (expr->VL_CLASS == Name) { - register struct idf *idf = expr->VL_IDF; - - if (idf->id_def->df_level >= L_LOCAL - && idf->id_def->df_sc != GLOBAL - && idf->id_def->df_sc != EXTERN) { - illegal_init_cst(expr); - } - else /* e.g., int f(); int p = f; */ - if (idf->id_def->df_type->tp_fund == FUNCTION) - C_con_pnam(idf->id_text); - else /* e.g., int a; int *p = &a; */ - C_con_dnam(idf->id_text, (arith)expr->VL_VALUE); - } - else { - assert(expr->VL_CLASS == Label); - C_con_dlb(expr->VL_LBL, (arith)expr->VL_VALUE); - } - break; - case FLOAT: - case DOUBLE: - case LNGDBL: - ch3cast(expp, '=', tp); - expr = *expp; -#ifdef DEBUG - print_expr("init-expr after cast", expr); -#endif /* DEBUG */ - if (expr->ex_class == Float) { - char buf[FLT_STRLEN]; - - flt_flt2str(&(expr->FL_ARITH), buf, FLT_STRLEN); - C_con_fcon(buf, expr->ex_type->tp_size); - } -#ifdef NOTDEF - -Coercion from int to float is now always done compile time. -This, to accept declarations like -double x = -(double)1; -and also to prevent runtime coercions for compile-time constants. - - else - if (expr->ex_class == Oper && expr->OP_OPER == INT2FLOAT) { - /* float f = 1; */ - expr = expr->OP_RIGHT; - if (is_cp_cst(expr)) - C_con_fcon(long2str((long)expr->VL_VALUE, 10), - tp->tp_size); - else - illegal_init_cst(expr); - } -#endif /* NOTDEF */ - else - illegal_init_cst(expr); - break; - -#ifndef NOBITFIELD - case FIELD: - ch3cast(expp, '=', tp->tp_up); - expr = *expp; -#ifdef DEBUG - print_expr("init-expr after cast", expr); -#endif /* DEBUG */ - if (is_cp_cst(expr)) - put_bf(tp, (arith)expr->VL_VALUE); - else - illegal_init_cst(expr); - break; -#endif /* NOBITFIELD */ - - case ERRONEOUS: - if (! gen_error) gen_error = pack_level; - /* fall through */ - case VOID: - break; - default: - crash("check_ival"); - /*NOTREACHED*/ - } -} - -/* ch_array() initialises an array of characters when given - a string constant. - Alignment is taken care of. -*/ -void ch_array(struct type **tpp, /* type tp = array of characters */ - struct expr *ex) -{ - register struct type *tp = *tpp; - register int length = ex->SG_LEN, i; - register char *to, *from, *s; - - assert(ex->ex_class == String); - if (tp->tp_size == (arith)-1) { - /* set the dimension */ - tp = *tpp = construct_type(ARRAY, tp->tp_up, 0, (arith)length, NO_PROTO); - } - else { - arith dim = tp->tp_size / tp->tp_up->tp_size; - -#ifdef LINT - if (length == dim + 1) { - expr_warning(ex, "array is not null-terminated"); - } else -#endif - if (length > dim + 1) { - expr_strict(ex, "too many initializers"); - } - length = dim; - } - /* throw out the characters of the already prepared string */ - s = Malloc((unsigned) (length)); - clear(s, (unsigned)length); - i = length <= ex->SG_LEN ? length : ex->SG_LEN; - to = s; from = ex->SG_VALUE; - while(--i >= 0) { - *to++ = *from++; - } - free(ex->SG_VALUE); - str_cst(s, length, 0); /* a string, but not in rom */ - free(s); -} - -/* As long as some parts of the pipeline cannot handle very long string - constants, string constants are written out in chunks -*/ -void str_cst(register char *str, register int len, int inrom) -{ - int chunksize = ((127 + (int) word_size) / (int) word_size) * (int) word_size; - - while (len > chunksize) { - if (inrom) - C_rom_scon(str, (arith) chunksize); - else C_con_scon(str, (arith) chunksize); - len -= chunksize; - str += chunksize; - } - if (inrom) - C_rom_scon(str, (arith) len); - else C_con_scon(str, (arith) len); -} - -#ifndef NOBITFIELD -/* put_bf() takes care of the initialisation of (bit-)field - selectors of a struct: each time such an initialisation takes place, - put_bf() is called instead of the normal code generating routines. - Put_bf() stores the given integral value into "field" and - "throws" the result of "field" out if the current selector - is the last of this number of fields stored at the same address. -*/ -void put_bf(struct type *tp, arith val) -{ - static long field = (arith)0; - static arith offset = (arith)-1; - register struct field *fd = tp->tp_field; - register struct sdef *sd = fd->fd_sdef; - static struct expr exp; - - assert(sd); - if (offset == (arith)-1) { - /* first bitfield in this field */ - offset = sd->sd_offset; - exp.ex_type = tp->tp_up; - exp.ex_class = Value; - exp.VL_CLASS = Const; - } - if (val != 0) /* insert the value into "field" */ - field |= (val & fd->fd_mask) << fd->fd_shift; - if (sd->sd_sdef == 0 || sd->sd_sdef->sd_offset != offset) { - /* the selector was the last stored at this address */ - exp.VL_VALUE = (writh)field; - con_int(&exp); - field = (arith)0; - offset = (arith)-1; - } -} -#endif /* NOBITFIELD */ - -int zero_bytes(register struct sdef *sd) -{ - /* fills the space between a selector of a struct - and the next selector of that struct with zero-bytes. - */ - register int n = sd->sd_sdef->sd_offset - sd->sd_offset - - size_of_type(sd->sd_type, "struct member"); - int count = n; - - while (n-- > 0) - con_nullbyte(); - return count; -} - -int valid_type(struct type *tp, char *str) -{ - assert(tp!=(struct type *)0); - if (tp->tp_size < 0) { - error("size of %s unknown", str); - return 0; - } - return 1; -} - -void con_int(register struct expr *ex) -{ - register struct type *tp = ex->ex_type; - - assert(is_cp_cst(ex)); - if (tp->tp_unsigned) - C_con_ucon(writh2str(ex->VL_VALUE, 1), tp->tp_size); - else if (tp->tp_size == word_size) - C_con_cst((arith)ex->VL_VALUE); - else - C_con_icon(writh2str(ex->VL_VALUE, 0), tp->tp_size); -} - -void illegal_init_cst(struct expr *ex) -{ - expr_error(ex, "illegal initialization constant"); - gen_error = pack_level; -} - -void too_many_initialisers(void) -{ - error("too many initializers"); - gen_error = pack_level; -} -} +/* + * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. + * See the copyright notice in the ACK home directory, in the file "Copyright". + */ +/* $Id$ */ +/* CODE FOR THE INITIALISATION OF GLOBAL VARIABLES */ + +{ +#include +#include +#include "parameters.h" +#ifndef LINT +#include +#else +#include "l_em.h" +#include "l_lint.h" +#endif /* LINT */ +#include +#include +#include +#include +#include +#include "idf.h" +#include "arith.h" +#include "label.h" +#include "expr.h" +#include "type.h" +#include "proto.h" +#include "struct.h" +#include "field.h" +#include "Lpars.h" +#include "sizes.h" +#include "align.h" +#include "level.h" +#include "error.h" +#include "def.h" +#include "LLlex.h" +#include "estack.h" +#include "stack.h" +#include "ch3.h" + +#define con_nullbyte() C_con_ucon("0", (arith)1) +#define aggregate_type(tp) ((tp)->tp_fund == ARRAY || (tp)->tp_fund == STRUCT) + +extern char options[]; +static int gen_error; +static int pack_level; +struct e_stack *p_stack; + +void gen_tpcheck(struct type **); +void gen_simple_exp(struct type **, struct expr **); +struct type **arr_elem(struct type **, struct e_stack *); +struct sdef *next_field(register struct sdef *,register struct e_stack *); +struct type **gen_tphead(struct type **, int); +struct type **gen_tpmiddle(void); +struct sdef *gen_align_to_next(register struct e_stack *); +void gen_tpend(void); +void check_and_pad(struct expr **, struct type **); +void pad(struct type *); +void check_ival(struct expr **, register struct type *); +void ch_array(struct type **, /* type tp = array of characters */ + struct expr *); +void str_cst(register char *, register int, int); +#ifndef NOBITFIELD +void put_bf(struct type *, arith ); +#endif /* NOBITFIELD */ +int zero_bytes(register struct sdef *); +int valid_type(struct type *, char *); +void con_int(register struct expr *); +void illegal_init_cst(struct expr *); +void too_many_initialisers(void); + +} + +/* initial_value recursively guides the initialisation expression. + */ +/* 3.5 */ + +initial_value(register struct type **tpp; register struct expr **expp;) : + { if (tpp) gen_tpcheck(tpp); } +[ + { if (pack_level == 0) gen_error = 0; } + assignment_expression(expp) + { +#ifdef LINT + lint_expr(*expp, USED); +#endif /* LINT */ + if ((*expp)->ex_type->tp_fund == ARRAY) + array2pointer(*expp); + if (tpp) { + if (level >= L_LOCAL + || is_ld_cst(*expp) + || is_fp_cst(*expp) + || (*expp)->ex_class == String) { + gen_simple_exp(tpp, expp); + free_expression(*expp); + *expp = 0; + } else { + expr_error(*expp,"illegal initialization"); + free_expression(*expp); + *expp = 0; + } + } + } +| + initial_value_pack(tpp, expp) +] +; + +initial_value_pack(struct type **tpp; struct expr **expp;) +: + '{' + { if (pack_level == 0) gen_error = 0; pack_level++; } + initial_value_list(tpp, expp) + { pack_level--; + if (!pack_level) { + while (p_stack) { + struct e_stack *p = p_stack->next; + + free_e_stack(p_stack); + p_stack = p; + } + } + if (pack_level < gen_error) gen_error = 0; + } + '}' +; + +initial_value_list(register struct type **tpp; struct expr **expp;) + { struct expr *e1; + register struct type **tpp2 = 0; + int err_flag = gen_error; + } +: + { if (tpp) tpp2 = gen_tphead(tpp, 0); } + initial_value(tpp2, &e1) + { if (!tpp) init_expression(&expp, e1); } + [%while (AHEAD != '}') /* >>> conflict on ',' */ + ',' + { if (tpp) tpp2 = gen_tpmiddle(); } + initial_value(tpp2, &e1) + { if (!tpp) init_expression(&expp, e1); } + ]* + { if (tpp && ! err_flag) gen_tpend(); } + ','? /* optional trailing comma */ +; + +{ +void gen_tpcheck(struct type **tpp) +{ + register struct type *tp; + + if (gen_error) return; + switch((tp = *tpp)->tp_fund) { + case ARRAY: + if (! valid_type(tp->tp_up, "array element")) + gen_error = pack_level; + break; + case STRUCT: + if (! valid_type(tp, "struct")) + gen_error = pack_level; + break; + case UNION: + if (! valid_type(tp, "union")) + gen_error = pack_level; + break; + case ERRONEOUS: + if (! gen_error) gen_error = pack_level; + break; + } +} + +void gen_simple_exp(struct type **tpp, struct expr **expp) +{ + register struct type *tp; + + if (gen_error) return; + tp = *tpp; + switch(tp->tp_fund) { + case ARRAY: + if ((*expp)->ex_class == String && tp->tp_up->tp_fund == CHAR) { + ch_array(tpp,*expp); + break; + } + /* Fall through */ + case UNION: + case STRUCT: + check_and_pad(expp, tpp); + break; + case ERRONEOUS: + case FUNCTION: + case VOID: + gen_error = pack_level; + break; + default: + check_ival(expp, tp); + break; + } +} + +struct type **arr_elem(struct type **tpp, struct e_stack *p) +{ + register struct type *tp = *tpp; + + if (tp->tp_up->tp_fund == CHAR && AHEAD == STRING && p->elem_count == 1) { + p->nelem = 1; + return tpp; + } + if (AHEAD == '{' || (! aggregate_type(tp->tp_up) && tp->tp_up->tp_fund != UNION)) + return &(tp->tp_up); + return gen_tphead(&(tp->tp_up), 1); +} + +struct sdef *next_field(register struct sdef *sd, + register struct e_stack *p) +{ + if (sd->sd_sdef) + p->bytes_upto_here += zero_bytes(sd); + p->bytes_upto_here += + size_of_type(sd->sd_type, "selector"); + p->last_offset = sd->sd_offset; + return sd->sd_sdef; +} + +struct type **gen_tphead(struct type **tpp, int nest) +{ + register struct type *tp = *tpp; + register struct e_stack *p; + register struct sdef *sd; + + if (tpp && *tpp == error_type) { + gen_error = pack_level; + return 0; + } + if (gen_error) return tpp; + if (tp->tp_fund == UNION) { + /* Here, we saw a {, which could be the start of a union + initializer. It could, however, also be the start of the + initializer for the first union field ... + */ + sd = tp->tp_sdef; + if (AHEAD != '{' && + (aggregate_type(sd->sd_type) || + sd->sd_type->tp_fund == UNION)) { + /* In this case, assume that it is the start of the + initializer of the union field, so: + */ + return gen_tphead(&(tp->tp_sdef->sd_type), nest); + } + } + p = new_e_stack(); + p->next = p_stack; + p_stack = p; + p->s_nested = nest; + p->s_tpp = tpp; + switch(tp->tp_fund) { + case UNION: + p->s_def = sd = tp->tp_sdef; + p->bytes_upto_here = 0; + return &(sd->sd_type); + case ARRAY: + p->nelem = -1; + p->elem_count = 1; + if (tp->tp_size != (arith) -1) { + p->nelem = (tp->tp_size / tp->tp_up->tp_size); + } + return arr_elem(tpp, p); + case STRUCT: + p->s_def = sd = tp->tp_sdef; + p->bytes_upto_here = 0; + p->last_offset = -1; +#ifndef NOBITFIELD + while (sd && is_anon_idf(sd->sd_idf)) { + put_bf(sd->sd_type, (arith) 0); + sd = next_field(sd, p); + } +#endif + if (! sd) { + /* something wrong with this struct */ + gen_error = pack_level; + p_stack = p->next; + free_e_stack(p); + return 0; + } + p->s_def = sd; + if (AHEAD != '{' && aggregate_type(sd->sd_type)) { + return gen_tphead(&(sd->sd_type), 1); + } + return &(sd->sd_type); + case ERRONEOUS: + if (! gen_error) gen_error = pack_level; + /* fall through */ + default: + p->nelem = 1; + p->elem_count = 1; + return tpp; + } +} + +struct type **gen_tpmiddle(void) +{ + register struct type *tp; + register struct sdef *sd; + register struct e_stack *p = p_stack; + + if (gen_error) { + if (p) return p->s_tpp; + return 0; + } +again: + tp = *(p->s_tpp); + switch(tp->tp_fund) { + case ERRONEOUS: + if (! gen_error) gen_error = pack_level; + return p->s_tpp; + case UNION: + sd = p->s_def; + p->bytes_upto_here += + size_of_type(sd->sd_type, "selector"); + return p->s_tpp; + default: + if (p->elem_count == p->nelem && p->s_nested) { + p = p->next; + free_e_stack(p_stack); + p_stack = p; + goto again; + } + p->elem_count++; + if (p->nelem >= 0 && p->elem_count > p->nelem) { + too_many_initialisers(); + return p->s_tpp; + } + if (tp->tp_fund == ARRAY) { + return arr_elem(p->s_tpp, p); + } + return p->s_tpp; + case STRUCT: + sd = gen_align_to_next(p); + if (! sd) { + while (p->bytes_upto_here++ < tp->tp_size) + con_nullbyte(); + if (p->s_nested) { + p = p->next; + free_e_stack(p_stack); + p_stack = p; + goto again; + } + too_many_initialisers(); + return p->s_tpp; + } + if (AHEAD != '{' && aggregate_type(sd->sd_type)) { + return gen_tphead(&(sd->sd_type), 1); + } + return &(sd->sd_type); + } +} + +struct sdef *gen_align_to_next(register struct e_stack *p) +{ + register struct sdef *sd = p->s_def; + + if (! sd) return sd; +#ifndef NOBITFIELD + do { + if (is_anon_idf(sd->sd_idf)) put_bf(sd->sd_type, (arith) 0); +#endif + sd = next_field(sd, p); +#ifndef NOBITFIELD + } while (sd && is_anon_idf(sd->sd_idf)); +#endif + p->s_def = sd; + return sd; +} + +void gen_tpend(void) +{ + register struct e_stack *p = p_stack; + register struct type *tp; + register struct sdef *sd; + int getout = 0; + + while (!getout && p) { + if (!gen_error) { + tp = *(p->s_tpp); + switch(tp->tp_fund) { + case UNION: + sd = p->s_def; + p->bytes_upto_here += + size_of_type(sd->sd_type, "selector"); + while (p->bytes_upto_here++ < tp->tp_size) + con_nullbyte(); + break; + case ARRAY: + if (tp->tp_size == -1) { + *(p->s_tpp) = construct_type(ARRAY, tp->tp_up, + 0, p->elem_count, NO_PROTO); + } + else { + while (p->nelem-- > p->elem_count) { + pad(tp->tp_up); + } + } + break; + case STRUCT: + sd = gen_align_to_next(p); + while (sd) { + pad(sd->sd_type); + if (sd->sd_sdef) + p->bytes_upto_here += zero_bytes(sd); + p->bytes_upto_here += + size_of_type(sd->sd_type, "selector"); + sd = sd->sd_sdef; + } + while (p->bytes_upto_here++ < tp->tp_size) + con_nullbyte(); + break; + } + } + if (! p->s_nested) getout = 1; + p = p->next; + free_e_stack(p_stack); + p_stack = p; + } +} + +/* check_and_pad() is given a simple initialisation expression + where the type can be either a simple or an aggregate type. + In the latter case, only the first member is initialised and + the rest is zeroed. +*/ +void check_and_pad(struct expr **expp, struct type **tpp) +{ + register struct type *tp = *tpp; + + if (tp->tp_fund == ARRAY) { + check_and_pad(expp, &(tp->tp_up)); /* first member */ + if (tp->tp_size == (arith)-1) + /* no size specified upto here: just + set it to the size of one member. + */ + tp = *tpp = construct_type(ARRAY, tp->tp_up, + 0, (arith)1, NO_PROTO); + else { + register int dim = tp->tp_size / tp->tp_up->tp_size; + /* pad remaining members with zeroes */ + while (--dim > 0) + pad(tp->tp_up); + } + } + else + if (tp->tp_fund == STRUCT) { + register struct sdef *sd = tp->tp_sdef; + + check_and_pad(expp, &(sd->sd_type)); + /* next selector is aligned by adding extra zeroes */ + if (sd->sd_sdef) + zero_bytes(sd); + while ( (sd = sd->sd_sdef)!=0) { /* pad remaining selectors */ + pad(sd->sd_type); + if (sd->sd_sdef) + zero_bytes(sd); + } + } + else if (tp->tp_fund == UNION) { + /* only the first selector can be initialized */ + register struct sdef *sd = tp->tp_sdef; + + check_and_pad(expp, &(sd->sd_type)); + } + else /* simple type */ + check_ival(expp, tp); +} + +/* pad() fills an element of type tp with zeroes. + If the element is an aggregate, pad() is called recursively. +*/ +void pad(struct type *tpx) +{ + register struct type *tp = tpx; + register arith sz = tp->tp_size; + + gen_tpcheck(&tpx); + if (gen_error) return; +#ifndef NOBITFIELD + if (tp->tp_fund == FIELD) { + put_bf(tp, (arith)0); + return; + } +#endif /* NOBITFIELD */ + + if (tp->tp_align >= word_align) while (sz >= word_size) { + C_con_cst((arith) 0); + sz -= word_size; + } + while (sz) { + C_con_icon("0", (arith) 1); + sz--; + } +} + +/* check_ival() checks whether the initialisation of an element + of a fundamental type is legal and, if so, performs the initialisation + by directly generating the necessary code. + No further comment is needed to explain the internal structure + of this straightforward function. +*/ +void check_ival(struct expr **expp, register struct type *tp) +{ + /* The philosophy here is that ch3cast puts an explicit + conversion node in front of the expression if the types + are not compatible. In this case, the initialisation + expression is no longer a constant. + */ + register struct expr *expr = *expp; + + switch (tp->tp_fund) { + case CHAR: + case SHORT: + case INT: + case LONG: + case LNGLNG: + case ENUM: + case POINTER: + ch3cast(expp, '=', tp); + expr = *expp; +#ifdef DEBUG + print_expr("init-expr after cast", expr); +#endif /* DEBUG */ + if (!is_ld_cst(expr)) + illegal_init_cst(expr); + else + if (expr->VL_CLASS == Const) + con_int(expr); + else + if (expr->VL_CLASS == Name) { + register struct idf *idf = expr->VL_IDF; + + if (idf->id_def->df_level >= L_LOCAL + && idf->id_def->df_sc != GLOBAL + && idf->id_def->df_sc != EXTERN) { + illegal_init_cst(expr); + } + else /* e.g., int f(); int p = f; */ + if (idf->id_def->df_type->tp_fund == FUNCTION) + C_con_pnam(idf->id_text); + else /* e.g., int a; int *p = &a; */ + C_con_dnam(idf->id_text, (arith)expr->VL_VALUE); + } + else { + assert(expr->VL_CLASS == Label); + C_con_dlb(expr->VL_LBL, (arith)expr->VL_VALUE); + } + break; + case FLOAT: + case DOUBLE: + case LNGDBL: + ch3cast(expp, '=', tp); + expr = *expp; +#ifdef DEBUG + print_expr("init-expr after cast", expr); +#endif /* DEBUG */ + if (expr->ex_class == Float) { + char buf[FLT_STRLEN]; + + flt_flt2str(&(expr->FL_ARITH), buf, FLT_STRLEN); + C_con_fcon(buf, expr->ex_type->tp_size); + } +#ifdef NOTDEF + +Coercion from int to float is now always done compile time. +This, to accept declarations like +double x = -(double)1; +and also to prevent runtime coercions for compile-time constants. + + else + if (expr->ex_class == Oper && expr->OP_OPER == INT2FLOAT) { + /* float f = 1; */ + expr = expr->OP_RIGHT; + if (is_cp_cst(expr)) + C_con_fcon(long2str((long)expr->VL_VALUE, 10), + tp->tp_size); + else + illegal_init_cst(expr); + } +#endif /* NOTDEF */ + else + illegal_init_cst(expr); + break; + +#ifndef NOBITFIELD + case FIELD: + ch3cast(expp, '=', tp->tp_up); + expr = *expp; +#ifdef DEBUG + print_expr("init-expr after cast", expr); +#endif /* DEBUG */ + if (is_cp_cst(expr)) + put_bf(tp, (arith)expr->VL_VALUE); + else + illegal_init_cst(expr); + break; +#endif /* NOBITFIELD */ + + case ERRONEOUS: + if (! gen_error) gen_error = pack_level; + /* fall through */ + case VOID: + break; + default: + crash("check_ival"); + /*NOTREACHED*/ + } +} + +/* ch_array() initialises an array of characters when given + a string constant. + Alignment is taken care of. +*/ +void ch_array(struct type **tpp, /* type tp = array of characters */ + struct expr *ex) +{ + register struct type *tp = *tpp; + register int length = ex->SG_LEN, i; + register char *to, *from, *s; + + assert(ex->ex_class == String); + if (tp->tp_size == (arith)-1) { + /* set the dimension */ + tp = *tpp = construct_type(ARRAY, tp->tp_up, 0, (arith)length, NO_PROTO); + } + else { + arith dim = tp->tp_size / tp->tp_up->tp_size; + +#ifdef LINT + if (length == dim + 1) { + expr_warning(ex, "array is not null-terminated"); + } else +#endif + if (length > dim + 1) { + expr_strict(ex, "too many initializers"); + } + length = dim; + } + /* throw out the characters of the already prepared string */ + s = Malloc((unsigned) (length)); + clear(s, (unsigned)length); + i = length <= ex->SG_LEN ? length : ex->SG_LEN; + to = s; from = ex->SG_VALUE; + while(--i >= 0) { + *to++ = *from++; + } + free(ex->SG_VALUE); + str_cst(s, length, 0); /* a string, but not in rom */ + free(s); +} + +/* As long as some parts of the pipeline cannot handle very long string + constants, string constants are written out in chunks +*/ +void str_cst(register char *str, register int len, int inrom) +{ + int chunksize = ((127 + (int) word_size) / (int) word_size) * (int) word_size; + + while (len > chunksize) { + if (inrom) + C_rom_scon(str, (arith) chunksize); + else C_con_scon(str, (arith) chunksize); + len -= chunksize; + str += chunksize; + } + if (inrom) + C_rom_scon(str, (arith) len); + else C_con_scon(str, (arith) len); +} + +#ifndef NOBITFIELD +/* put_bf() takes care of the initialisation of (bit-)field + selectors of a struct: each time such an initialisation takes place, + put_bf() is called instead of the normal code generating routines. + Put_bf() stores the given integral value into "field" and + "throws" the result of "field" out if the current selector + is the last of this number of fields stored at the same address. +*/ +void put_bf(struct type *tp, arith val) +{ + static long field = (arith)0; + static arith offset = (arith)-1; + register struct field *fd = tp->tp_field; + register struct sdef *sd = fd->fd_sdef; + static struct expr exp; + + assert(sd); + if (offset == (arith)-1) { + /* first bitfield in this field */ + offset = sd->sd_offset; + exp.ex_type = tp->tp_up; + exp.ex_class = Value; + exp.VL_CLASS = Const; + } + if (val != 0) /* insert the value into "field" */ + field |= (val & fd->fd_mask) << fd->fd_shift; + if (sd->sd_sdef == 0 || sd->sd_sdef->sd_offset != offset) { + /* the selector was the last stored at this address */ + exp.VL_VALUE = (writh)field; + con_int(&exp); + field = (arith)0; + offset = (arith)-1; + } +} +#endif /* NOBITFIELD */ + +int zero_bytes(register struct sdef *sd) +{ + /* fills the space between a selector of a struct + and the next selector of that struct with zero-bytes. + */ + register int n = sd->sd_sdef->sd_offset - sd->sd_offset - + size_of_type(sd->sd_type, "struct member"); + int count = n; + + while (n-- > 0) + con_nullbyte(); + return count; +} + +int valid_type(struct type *tp, char *str) +{ + assert(tp!=(struct type *)0); + if (tp->tp_size < 0) { + error("size of %s unknown", str); + return 0; + } + return 1; +} + +void con_int(register struct expr *ex) +{ + register struct type *tp = ex->ex_type; + + assert(is_cp_cst(ex)); + if (tp->tp_unsigned) + C_con_ucon(writh2str(ex->VL_VALUE, 1), tp->tp_size); + else if (tp->tp_size == word_size) + C_con_cst((arith)ex->VL_VALUE); + else + C_con_icon(writh2str(ex->VL_VALUE, 0), tp->tp_size); +} + +void illegal_init_cst(struct expr *ex) +{ + expr_error(ex, "illegal initialization constant"); + gen_error = pack_level; +} + +void too_many_initialisers(void) +{ + error("too many initializers"); + gen_error = pack_level; +} +} diff --git a/lang/cem/cemcom.ansi/program.g b/lang/cem/cemcom.ansi/program.g index 616065da5..ecb5c25d1 100644 --- a/lang/cem/cemcom.ansi/program.g +++ b/lang/cem/cemcom.ansi/program.g @@ -1,227 +1,227 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* $Id$ */ -/* PROGRAM PARSER */ - -/* The presence of typedef declarations renders it impossible to - make a context-free grammar of C. Consequently we need - context-sensitive parsing techniques, the simplest one being - a subtle cooperation between the parser and the lexical scanner. - The lexical scanner has to know whether to return IDENTIFIER - or TYPE_IDENTIFIER for a given tag, and it obtains this information - from the definition list, as constructed by the parser. - The present grammar is essentially LL(2), and is processed by - a parser generator which accepts LL(1) with tie breaking rules - in C, of the form %if(cond) and %while(cond). To solve the LL(1) - ambiguities, the lexical scanner does a one symbol look-ahead. - This symbol, however, cannot always be correctly assessed, since - the present symbol may cause a change in the definition list - which causes the identification of the look-ahead symbol to be - invalidated. - The lexical scanner relies on the parser (or its routines) to - detect this situation and then update the look-ahead symbol. - An alternative approach would be to reassess the look-ahead symbol - in the lexical scanner when it is promoted to dot symbol. This - would be more beautiful but less correct, since then for a short - while there would be a discrepancy between the look-ahead symbol - and the definition list; I think it would nevertheless work in - correct programs. - A third solution would be to enter the identifier as soon as it - is found; its storage class is then known, although its full type - isn't. We would have to fill that in afterwards. - - At block exit the situation is even worse. Upon reading the - closing brace, the names declared inside the function are cleared - from the name list. This action may expose a type identifier that - is the same as the identifier in the look-ahead symbol. This - situation certainly invalidates the third solution, and casts - doubts upon the second. -*/ - -%lexical LLlex; -%start C_program, program; -%start If_expr, control_if_expression; - -{ -#include "parameters.h" -#include -#include "arith.h" -#include "LLlex.h" -#include "label.h" -#include "type.h" -#include "declar.h" -#include "decspecs.h" -#include "code.h" -#include "expr.h" -#include "def.h" -#include "idf.h" -#include "declarator.h" -#include "stack.h" -#include "proto.h" -#include "error.h" -#ifdef LINT -#include "l_lint.h" -#endif /* LINT */ - -} - -control_if_expression - { - struct expr *exprX; - } -: - constant_expression(&exprX) - { - } -; - -/* 3.7 */ -program: - [%persistent external_definition]* - { unstack_world(); } -; - -/* A C identifier definition is remarkable in that it formulates - the declaration in a way different from most other languages: - e.g., rather than defining x as a pointer-to-integer, it defines - *x as an integer and lets the compiler deduce that x is actually - pointer-to-integer. This has profound consequences, both for the - structure of an identifier definition and for the compiler. - - A definition starts with a decl_specifiers, which contains things - like - typedef int - which is implicitly repeated for every definition in the list, and - then for each identifier a declarator is given, of the form - *a() - or so. The decl_specifiers is kept in a struct decspecs, to be - used again and again, while the declarator is stored in a struct - declarator, only to be passed to declare_idf together with the - struct decspecs. - - With the introduction of prototypes, extra problems for the scope - administration were introduced as well. We can have, for example, - int x(double x); - and - int x(double x) { ... use(x) ... } - In the first case, the parameter name can be forgotten, whereas in - the second case, the parameter should have a block scope. The - problem lies in the fact that the parameter's type is known before - the type of the function, which causes the def structure to be on - the end of the list. Our solution is as follows: - 1- In case of a declaration, throw the parameter identifier away - before the declaration of the outer x. - 2- In case of a definition, the function begin_proc() changes the - def list for the identifier. This means that declare_idf() - contains an extra test in case we already saw a declaration of - such a function, because this function is called before - begin_proc(). -*/ - -external_definition - { struct decspecs Ds; - struct declarator Dc; - } -: - { Ds = null_decspecs; - Dc = null_declarator; - } - [ %if (DOT != IDENTIFIER || AHEAD == IDENTIFIER) - decl_specifiers(&Ds) - | - {do_decspecs(&Ds);} - ] - [ - declarator(&Dc) - { - declare_idf(&Ds, &Dc, level); -#ifdef LINT - lint_ext_def(Dc.dc_idf, Ds.ds_sc); -#endif /* LINT */ - } - [ - function(&Ds, &Dc) - | - { if (! Ds.ds_sc_given && ! Ds.ds_typequal && - Ds.ds_notypegiven) { - strict("declaration specifiers missing"); - } - } - non_function(&Ds, &Dc) - ] - | - { if (! Ds.ds_sc_given && ! Ds.ds_typequal && - Ds.ds_notypegiven) { - strict("declaration missing"); - } - } - ';' - ] - {remove_declarator(&Dc); flush_strings(); } -; - -non_function(register struct decspecs *ds; register struct declarator *dc;) -: - { reject_params(dc); - } - [ - initializer(dc->dc_idf, ds->ds_sc) - | - { code_declaration(dc->dc_idf, (struct expr *) 0, level, ds->ds_sc); } - ] - { -#ifdef LINT - lint_non_function_decl(ds, dc); -#endif /* LINT */ - } - [ - ',' - init_declarator(ds) - ]* - ';' -; - -/* 3.7.1 */ -function(struct decspecs *ds; struct declarator *dc;) - { - arith fbytes; - register struct idf *idf = dc->dc_idf; - } -: - { -#ifdef LINT - lint_start_function(); -#endif /* LINT */ - idf_initialized(idf); - stack_level(); /* L_FORMAL1 declarations */ - declare_params(dc); - begin_proc(ds, idf); /* sets global function info */ - stack_level(); /* L_FORMAL2 declarations */ - declare_protos(dc); - } - declaration* - { - check_formals(idf, dc); /* check style-mixtures */ - declare_formals(idf, &fbytes); -#ifdef LINT - lint_formals(); -#endif /* LINT */ - } - compound_statement - { - end_proc(fbytes); -#ifdef LINT - lint_implicit_return(); -#endif /* LINT */ - unstack_level(); /* L_FORMAL2 declarations */ -#ifdef LINT - lint_end_formals(); -#endif /* LINT */ - unstack_level(); /* L_FORMAL1 declarations */ -#ifdef LINT - lint_end_function(); -#endif /* LINT */ - } -; +/* + * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. + * See the copyright notice in the ACK home directory, in the file "Copyright". + */ +/* $Id$ */ +/* PROGRAM PARSER */ + +/* The presence of typedef declarations renders it impossible to + make a context-free grammar of C. Consequently we need + context-sensitive parsing techniques, the simplest one being + a subtle cooperation between the parser and the lexical scanner. + The lexical scanner has to know whether to return IDENTIFIER + or TYPE_IDENTIFIER for a given tag, and it obtains this information + from the definition list, as constructed by the parser. + The present grammar is essentially LL(2), and is processed by + a parser generator which accepts LL(1) with tie breaking rules + in C, of the form %if(cond) and %while(cond). To solve the LL(1) + ambiguities, the lexical scanner does a one symbol look-ahead. + This symbol, however, cannot always be correctly assessed, since + the present symbol may cause a change in the definition list + which causes the identification of the look-ahead symbol to be + invalidated. + The lexical scanner relies on the parser (or its routines) to + detect this situation and then update the look-ahead symbol. + An alternative approach would be to reassess the look-ahead symbol + in the lexical scanner when it is promoted to dot symbol. This + would be more beautiful but less correct, since then for a short + while there would be a discrepancy between the look-ahead symbol + and the definition list; I think it would nevertheless work in + correct programs. + A third solution would be to enter the identifier as soon as it + is found; its storage class is then known, although its full type + isn't. We would have to fill that in afterwards. + + At block exit the situation is even worse. Upon reading the + closing brace, the names declared inside the function are cleared + from the name list. This action may expose a type identifier that + is the same as the identifier in the look-ahead symbol. This + situation certainly invalidates the third solution, and casts + doubts upon the second. +*/ + +%lexical LLlex; +%start C_program, program; +%start If_expr, control_if_expression; + +{ +#include "parameters.h" +#include +#include "arith.h" +#include "LLlex.h" +#include "label.h" +#include "type.h" +#include "declar.h" +#include "decspecs.h" +#include "code.h" +#include "expr.h" +#include "def.h" +#include "idf.h" +#include "declarator.h" +#include "stack.h" +#include "proto.h" +#include "error.h" +#ifdef LINT +#include "l_lint.h" +#endif /* LINT */ + +} + +control_if_expression + { + struct expr *exprX; + } +: + constant_expression(&exprX) + { + } +; + +/* 3.7 */ +program: + [%persistent external_definition]* + { unstack_world(); } +; + +/* A C identifier definition is remarkable in that it formulates + the declaration in a way different from most other languages: + e.g., rather than defining x as a pointer-to-integer, it defines + *x as an integer and lets the compiler deduce that x is actually + pointer-to-integer. This has profound consequences, both for the + structure of an identifier definition and for the compiler. + + A definition starts with a decl_specifiers, which contains things + like + typedef int + which is implicitly repeated for every definition in the list, and + then for each identifier a declarator is given, of the form + *a() + or so. The decl_specifiers is kept in a struct decspecs, to be + used again and again, while the declarator is stored in a struct + declarator, only to be passed to declare_idf together with the + struct decspecs. + + With the introduction of prototypes, extra problems for the scope + administration were introduced as well. We can have, for example, + int x(double x); + and + int x(double x) { ... use(x) ... } + In the first case, the parameter name can be forgotten, whereas in + the second case, the parameter should have a block scope. The + problem lies in the fact that the parameter's type is known before + the type of the function, which causes the def structure to be on + the end of the list. Our solution is as follows: + 1- In case of a declaration, throw the parameter identifier away + before the declaration of the outer x. + 2- In case of a definition, the function begin_proc() changes the + def list for the identifier. This means that declare_idf() + contains an extra test in case we already saw a declaration of + such a function, because this function is called before + begin_proc(). +*/ + +external_definition + { struct decspecs Ds; + struct declarator Dc; + } +: + { Ds = null_decspecs; + Dc = null_declarator; + } + [ %if (DOT != IDENTIFIER || AHEAD == IDENTIFIER) + decl_specifiers(&Ds) + | + {do_decspecs(&Ds);} + ] + [ + declarator(&Dc) + { + declare_idf(&Ds, &Dc, level); +#ifdef LINT + lint_ext_def(Dc.dc_idf, Ds.ds_sc); +#endif /* LINT */ + } + [ + function(&Ds, &Dc) + | + { if (! Ds.ds_sc_given && ! Ds.ds_typequal && + Ds.ds_notypegiven) { + strict("declaration specifiers missing"); + } + } + non_function(&Ds, &Dc) + ] + | + { if (! Ds.ds_sc_given && ! Ds.ds_typequal && + Ds.ds_notypegiven) { + strict("declaration missing"); + } + } + ';' + ] + {remove_declarator(&Dc); flush_strings(); } +; + +non_function(register struct decspecs *ds; register struct declarator *dc;) +: + { reject_params(dc); + } + [ + initializer(dc->dc_idf, ds->ds_sc) + | + { code_declaration(dc->dc_idf, (struct expr *) 0, level, ds->ds_sc); } + ] + { +#ifdef LINT + lint_non_function_decl(ds, dc); +#endif /* LINT */ + } + [ + ',' + init_declarator(ds) + ]* + ';' +; + +/* 3.7.1 */ +function(struct decspecs *ds; struct declarator *dc;) + { + arith fbytes; + register struct idf *idf = dc->dc_idf; + } +: + { +#ifdef LINT + lint_start_function(); +#endif /* LINT */ + idf_initialized(idf); + stack_level(); /* L_FORMAL1 declarations */ + declare_params(dc); + begin_proc(ds, idf); /* sets global function info */ + stack_level(); /* L_FORMAL2 declarations */ + declare_protos(dc); + } + declaration* + { + check_formals(idf, dc); /* check style-mixtures */ + declare_formals(idf, &fbytes); +#ifdef LINT + lint_formals(); +#endif /* LINT */ + } + compound_statement + { + end_proc(fbytes); +#ifdef LINT + lint_implicit_return(); +#endif /* LINT */ + unstack_level(); /* L_FORMAL2 declarations */ +#ifdef LINT + lint_end_formals(); +#endif /* LINT */ + unstack_level(); /* L_FORMAL1 declarations */ +#ifdef LINT + lint_end_function(); +#endif /* LINT */ + } +; diff --git a/lang/cem/cemcom.ansi/statement.g b/lang/cem/cemcom.ansi/statement.g index d58ec4b6a..83c741d61 100644 --- a/lang/cem/cemcom.ansi/statement.g +++ b/lang/cem/cemcom.ansi/statement.g @@ -1,506 +1,506 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* $Id$ */ -/* STATEMENT SYNTAX PARSER */ - -{ -#include "parameters.h" -#ifndef LINT -#include -#else -#include "l_em.h" -#include "l_lint.h" -#endif /* LINT */ - -#include -#include "idf.h" -#include "arith.h" -#include "LLlex.h" -#include "type.h" -#include "label.h" -#include "expr.h" -#include "code.h" -#include "stack.h" -#include "def.h" -#include "switch.h" -#ifdef DBSYMTAB -#include -#endif /* DBSYMTAB */ - -extern int level; -extern char options[]; -} - -/* Each statement construction is stacked in order to trace a - * statement to such a construction. Example: a case statement should - * be recognized as a piece of the most enclosing switch statement. - */ - -/* 3.6 */ -statement - { -#ifdef LINT - lint_statement(); -#endif /* LINT */ - } -: -%if (AHEAD != ':') - expression_statement -| - label ':' statement -| - compound_statement -| - if_statement -| - while_statement -| - do_statement -| - for_statement -| - switch_statement -| - case_statement -| - default_statement -| - BREAK - { - code_break(); -#ifdef LINT - lint_break_stmt(); -#endif /* LINT */ - } - ';' -| - CONTINUE - { - code_continue(); -#ifdef LINT - lint_continue_stmt(); -#endif /* LINT */ - } - ';' -| - return_statement -| - jump -| - ';' -; - - -expression_statement - { struct expr *expr; - } -: - expression(&expr) - ';' - { -#ifdef DEBUG - print_expr("expression_statement", expr); -#endif /* DEBUG */ - code_expr(expr, RVAL, FALSE, NO_LABEL, NO_LABEL); - free_expression(expr); - } -; - -/* 3.6.1 (partially) */ -label - { struct idf *idf; } -: - identifier(&idf) - { - /* This allows the following absurd case: - - typedef int grz; - main() { - grz: printf("A labelled statement\n"); - } - */ -#ifdef LINT - lint_label(); -#endif /* LINT */ - define_label(idf); - C_df_ilb((label)idf->id_label->df_address); - } -; - -/* 3.6.4.1 */ -if_statement - { - struct expr *expr; - label l_true = text_label(); - label l_false = text_label(); - label l_end = text_label(); - } -: - IF - '(' - expression(&expr) - { - opnd2test(&expr, IF); - if (is_cp_cst(expr)) { - /* The comparison has been optimized - to a 0 or 1. - */ - if (expr->VL_VALUE == 0) { - C_bra(l_false); - } - /* else fall through */ -#ifdef LINT - start_if_part(1); -#endif /* LINT */ - } - else { - code_expr(expr, RVAL, TRUE, l_true, l_false); - C_df_ilb(l_true); -#ifdef LINT - start_if_part(0); -#endif /* LINT */ - } - free_expression(expr); - } - ')' - statement - [%prefer - ELSE - { -#ifdef LINT - start_else_part(); -#endif /* LINT */ - C_bra(l_end); - C_df_ilb(l_false); - } - statement - { C_df_ilb(l_end); -#ifdef LINT - end_if_else_stmt(); -#endif /* LINT */ - } - | - empty - { C_df_ilb(l_false); -#ifdef LINT - end_if_stmt(); -#endif /* LINT */ - } - ] -; - -/* 3.6.5.3 */ -while_statement - { - struct expr *expr; - label l_break = text_label(); - label l_continue = text_label(); - label l_body = text_label(); - } -: - WHILE - { - stack_stmt(l_break, l_continue); - C_df_ilb(l_continue); - } - '(' - expression(&expr) - { - opnd2test(&expr, WHILE); - if (is_cp_cst(expr)) { - if (expr->VL_VALUE == 0) { - C_bra(l_break); - } - } - else { - code_expr(expr, RVAL, TRUE, l_body, l_break); - C_df_ilb(l_body); - } -#ifdef LINT - start_while_stmt(expr); -#endif /* LINT */ - } - ')' - statement - { - C_bra(l_continue); - C_df_ilb(l_break); - unstack_stmt(); - free_expression(expr); -#ifdef LINT - end_loop_body(); - end_loop_stmt(); -#endif /* LINT */ - } -; - -/* 3.6.5.2 */ -do_statement - { struct expr *expr; - label l_break = text_label(); - label l_continue = text_label(); - label l_body = text_label(); - } -: - DO - { C_df_ilb(l_body); - stack_stmt(l_break, l_continue); -#ifdef LINT - start_do_stmt(); -#endif /* LINT */ - } - statement - WHILE - '(' - { -#ifdef LINT - end_loop_body(); -#endif /* LINT */ - C_df_ilb(l_continue); - } - expression(&expr) - { - opnd2test(&expr, WHILE); - if (is_cp_cst(expr)) { - if (expr->VL_VALUE == 1) { - C_bra(l_body); - } -#ifdef LINT - end_do_stmt(1, expr->VL_VALUE != 0); -#endif /* LINT */ - } - else { - code_expr(expr, RVAL, TRUE, l_body, l_break); -#ifdef LINT - end_do_stmt(0, 0); -#endif /* LINT */ - } - C_df_ilb(l_break); - } - ')' - ';' - { - unstack_stmt(); - free_expression(expr); - } -; - -/* 3.6.5.3 */ -for_statement - { struct expr *e_init = 0, *e_test = 0, *e_incr = 0; - label l_break = text_label(); - label l_continue = text_label(); - label l_body = text_label(); - label l_test = text_label(); - } -: - FOR - { stack_stmt(l_break, l_continue); - } - '(' - [ - expression(&e_init) - { code_expr(e_init, RVAL, FALSE, NO_LABEL, NO_LABEL); - } - ]? - ';' - { C_df_ilb(l_test); - } - [ - expression(&e_test) - { - opnd2test(&e_test, FOR); - if (is_cp_cst(e_test)) { - if (e_test->VL_VALUE == 0) { - C_bra(l_break); - } - } - else { - code_expr(e_test, RVAL, TRUE, l_body, l_break); - C_df_ilb(l_body); - } - } - ]? - ';' - expression(&e_incr)? - ')' - { -#ifdef LINT - start_for_stmt(e_test); -#endif /* LINT */ - } - statement - { -#ifdef LINT - end_loop_body(); -#endif /* LINT */ - C_df_ilb(l_continue); - if (e_incr) - code_expr(e_incr, RVAL, FALSE, - NO_LABEL, NO_LABEL); - C_bra(l_test); - C_df_ilb(l_break); - unstack_stmt(); - free_expression(e_init); - free_expression(e_test); - free_expression(e_incr); -#ifdef LINT - end_loop_stmt(); -#endif /* LINT */ - } -; - -/* 3.6.4.2 */ -switch_statement - { - struct expr *expr; - } -: - SWITCH - '(' - expression(&expr) - { - code_startswitch(&expr); -#ifdef LINT - start_switch_part(is_cp_cst(expr)); -#endif /* LINT */ - } - ')' - statement - { -#ifdef LINT - end_switch_stmt(); -#endif /* LINT */ - code_endswitch(); - free_expression(expr); - } -; - -/* 3.6.1 (partially) */ -case_statement - { - struct expr *expr; - } -: - CASE - constant_expression(&expr) - { -#ifdef LINT - lint_case_stmt(0); -#endif /* LINT */ - code_case(expr); - free_expression(expr); - } - ':' - statement -; - -/* 3.6.1 (partially) */ -default_statement -: - DEFAULT - { -#ifdef LINT - lint_case_stmt(1); -#endif /* LINT */ - code_default(); - } - ':' - statement -; - -/* 3.6.6.4 */ -return_statement - { struct expr *expr = 0; - } -: - RETURN - [ - expression(&expr) - { -#ifdef LINT - lint_ret_conv(expr); -#endif /* LINT */ - - do_return_expr(expr); - free_expression(expr); -#ifdef LINT - lint_return_stmt(VALRETURNED); -#endif /* LINT */ - } - | - empty - { - do_return(); -#ifdef LINT - lint_return_stmt(NOVALRETURNED); -#endif /* LINT */ - } - ] - ';' -; - -/* 3.6.6.1 (partially) */ -jump - { struct idf *idf; - } -: - GOTO - identifier(&idf) - ';' - { - apply_label(idf); - C_bra((label)idf->id_label->df_address); -#ifdef LINT - lint_jump_stmt(idf); -#endif /* LINT */ - } -; - -/* 3.6.2 */ -compound_statement - { -#ifdef DBSYMTAB - static int brc_level = 1; - int decl_seen = brc_level == 1; -#endif /* DBSYMTAB */ - } -: - '{' - { - stack_level(); - } - [%while ((DOT != IDENTIFIER && AHEAD != ':') || - (DOT == IDENTIFIER && AHEAD == IDENTIFIER)) - /* >>> conflict on TYPE_IDENTIFIER, IDENTIFIER */ - declaration - { -#ifdef DBSYMTAB - decl_seen++; -#endif /* DBSYMTAB */ - } - ]* - { -#ifdef DBSYMTAB - ++brc_level; - if (options['g'] && decl_seen) { - C_ms_std((char *) 0, N_LBRAC, brc_level); - } -#endif /* DBSYMTAB */ - } - [%persistent - statement - ]* - '}' - { - unstack_level(); -#ifdef DBSYMTAB - if (options['g'] && decl_seen) { - C_ms_std((char *) 0, N_RBRAC, brc_level); - } - brc_level--; -#endif /* DBSYMTAB */ - } -; +/* + * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. + * See the copyright notice in the ACK home directory, in the file "Copyright". + */ +/* $Id$ */ +/* STATEMENT SYNTAX PARSER */ + +{ +#include "parameters.h" +#ifndef LINT +#include +#else +#include "l_em.h" +#include "l_lint.h" +#endif /* LINT */ + +#include +#include "idf.h" +#include "arith.h" +#include "LLlex.h" +#include "type.h" +#include "label.h" +#include "expr.h" +#include "code.h" +#include "stack.h" +#include "def.h" +#include "switch.h" +#ifdef DBSYMTAB +#include +#endif /* DBSYMTAB */ + +extern int level; +extern char options[]; +} + +/* Each statement construction is stacked in order to trace a + * statement to such a construction. Example: a case statement should + * be recognized as a piece of the most enclosing switch statement. + */ + +/* 3.6 */ +statement + { +#ifdef LINT + lint_statement(); +#endif /* LINT */ + } +: +%if (AHEAD != ':') + expression_statement +| + label ':' statement +| + compound_statement +| + if_statement +| + while_statement +| + do_statement +| + for_statement +| + switch_statement +| + case_statement +| + default_statement +| + BREAK + { + code_break(); +#ifdef LINT + lint_break_stmt(); +#endif /* LINT */ + } + ';' +| + CONTINUE + { + code_continue(); +#ifdef LINT + lint_continue_stmt(); +#endif /* LINT */ + } + ';' +| + return_statement +| + jump +| + ';' +; + + +expression_statement + { struct expr *expr; + } +: + expression(&expr) + ';' + { +#ifdef DEBUG + print_expr("expression_statement", expr); +#endif /* DEBUG */ + code_expr(expr, RVAL, FALSE, NO_LABEL, NO_LABEL); + free_expression(expr); + } +; + +/* 3.6.1 (partially) */ +label + { struct idf *idf; } +: + identifier(&idf) + { + /* This allows the following absurd case: + + typedef int grz; + main() { + grz: printf("A labelled statement\n"); + } + */ +#ifdef LINT + lint_label(); +#endif /* LINT */ + define_label(idf); + C_df_ilb((label)idf->id_label->df_address); + } +; + +/* 3.6.4.1 */ +if_statement + { + struct expr *expr; + label l_true = text_label(); + label l_false = text_label(); + label l_end = text_label(); + } +: + IF + '(' + expression(&expr) + { + opnd2test(&expr, IF); + if (is_cp_cst(expr)) { + /* The comparison has been optimized + to a 0 or 1. + */ + if (expr->VL_VALUE == 0) { + C_bra(l_false); + } + /* else fall through */ +#ifdef LINT + start_if_part(1); +#endif /* LINT */ + } + else { + code_expr(expr, RVAL, TRUE, l_true, l_false); + C_df_ilb(l_true); +#ifdef LINT + start_if_part(0); +#endif /* LINT */ + } + free_expression(expr); + } + ')' + statement + [%prefer + ELSE + { +#ifdef LINT + start_else_part(); +#endif /* LINT */ + C_bra(l_end); + C_df_ilb(l_false); + } + statement + { C_df_ilb(l_end); +#ifdef LINT + end_if_else_stmt(); +#endif /* LINT */ + } + | + empty + { C_df_ilb(l_false); +#ifdef LINT + end_if_stmt(); +#endif /* LINT */ + } + ] +; + +/* 3.6.5.3 */ +while_statement + { + struct expr *expr; + label l_break = text_label(); + label l_continue = text_label(); + label l_body = text_label(); + } +: + WHILE + { + stack_stmt(l_break, l_continue); + C_df_ilb(l_continue); + } + '(' + expression(&expr) + { + opnd2test(&expr, WHILE); + if (is_cp_cst(expr)) { + if (expr->VL_VALUE == 0) { + C_bra(l_break); + } + } + else { + code_expr(expr, RVAL, TRUE, l_body, l_break); + C_df_ilb(l_body); + } +#ifdef LINT + start_while_stmt(expr); +#endif /* LINT */ + } + ')' + statement + { + C_bra(l_continue); + C_df_ilb(l_break); + unstack_stmt(); + free_expression(expr); +#ifdef LINT + end_loop_body(); + end_loop_stmt(); +#endif /* LINT */ + } +; + +/* 3.6.5.2 */ +do_statement + { struct expr *expr; + label l_break = text_label(); + label l_continue = text_label(); + label l_body = text_label(); + } +: + DO + { C_df_ilb(l_body); + stack_stmt(l_break, l_continue); +#ifdef LINT + start_do_stmt(); +#endif /* LINT */ + } + statement + WHILE + '(' + { +#ifdef LINT + end_loop_body(); +#endif /* LINT */ + C_df_ilb(l_continue); + } + expression(&expr) + { + opnd2test(&expr, WHILE); + if (is_cp_cst(expr)) { + if (expr->VL_VALUE == 1) { + C_bra(l_body); + } +#ifdef LINT + end_do_stmt(1, expr->VL_VALUE != 0); +#endif /* LINT */ + } + else { + code_expr(expr, RVAL, TRUE, l_body, l_break); +#ifdef LINT + end_do_stmt(0, 0); +#endif /* LINT */ + } + C_df_ilb(l_break); + } + ')' + ';' + { + unstack_stmt(); + free_expression(expr); + } +; + +/* 3.6.5.3 */ +for_statement + { struct expr *e_init = 0, *e_test = 0, *e_incr = 0; + label l_break = text_label(); + label l_continue = text_label(); + label l_body = text_label(); + label l_test = text_label(); + } +: + FOR + { stack_stmt(l_break, l_continue); + } + '(' + [ + expression(&e_init) + { code_expr(e_init, RVAL, FALSE, NO_LABEL, NO_LABEL); + } + ]? + ';' + { C_df_ilb(l_test); + } + [ + expression(&e_test) + { + opnd2test(&e_test, FOR); + if (is_cp_cst(e_test)) { + if (e_test->VL_VALUE == 0) { + C_bra(l_break); + } + } + else { + code_expr(e_test, RVAL, TRUE, l_body, l_break); + C_df_ilb(l_body); + } + } + ]? + ';' + expression(&e_incr)? + ')' + { +#ifdef LINT + start_for_stmt(e_test); +#endif /* LINT */ + } + statement + { +#ifdef LINT + end_loop_body(); +#endif /* LINT */ + C_df_ilb(l_continue); + if (e_incr) + code_expr(e_incr, RVAL, FALSE, + NO_LABEL, NO_LABEL); + C_bra(l_test); + C_df_ilb(l_break); + unstack_stmt(); + free_expression(e_init); + free_expression(e_test); + free_expression(e_incr); +#ifdef LINT + end_loop_stmt(); +#endif /* LINT */ + } +; + +/* 3.6.4.2 */ +switch_statement + { + struct expr *expr; + } +: + SWITCH + '(' + expression(&expr) + { + code_startswitch(&expr); +#ifdef LINT + start_switch_part(is_cp_cst(expr)); +#endif /* LINT */ + } + ')' + statement + { +#ifdef LINT + end_switch_stmt(); +#endif /* LINT */ + code_endswitch(); + free_expression(expr); + } +; + +/* 3.6.1 (partially) */ +case_statement + { + struct expr *expr; + } +: + CASE + constant_expression(&expr) + { +#ifdef LINT + lint_case_stmt(0); +#endif /* LINT */ + code_case(expr); + free_expression(expr); + } + ':' + statement +; + +/* 3.6.1 (partially) */ +default_statement +: + DEFAULT + { +#ifdef LINT + lint_case_stmt(1); +#endif /* LINT */ + code_default(); + } + ':' + statement +; + +/* 3.6.6.4 */ +return_statement + { struct expr *expr = 0; + } +: + RETURN + [ + expression(&expr) + { +#ifdef LINT + lint_ret_conv(expr); +#endif /* LINT */ + + do_return_expr(expr); + free_expression(expr); +#ifdef LINT + lint_return_stmt(VALRETURNED); +#endif /* LINT */ + } + | + empty + { + do_return(); +#ifdef LINT + lint_return_stmt(NOVALRETURNED); +#endif /* LINT */ + } + ] + ';' +; + +/* 3.6.6.1 (partially) */ +jump + { struct idf *idf; + } +: + GOTO + identifier(&idf) + ';' + { + apply_label(idf); + C_bra((label)idf->id_label->df_address); +#ifdef LINT + lint_jump_stmt(idf); +#endif /* LINT */ + } +; + +/* 3.6.2 */ +compound_statement + { +#ifdef DBSYMTAB + static int brc_level = 1; + int decl_seen = brc_level == 1; +#endif /* DBSYMTAB */ + } +: + '{' + { + stack_level(); + } + [%while ((DOT != IDENTIFIER && AHEAD != ':') || + (DOT == IDENTIFIER && AHEAD == IDENTIFIER)) + /* >>> conflict on TYPE_IDENTIFIER, IDENTIFIER */ + declaration + { +#ifdef DBSYMTAB + decl_seen++; +#endif /* DBSYMTAB */ + } + ]* + { +#ifdef DBSYMTAB + ++brc_level; + if (options['g'] && decl_seen) { + C_ms_std((char *) 0, N_LBRAC, brc_level); + } +#endif /* DBSYMTAB */ + } + [%persistent + statement + ]* + '}' + { + unstack_level(); +#ifdef DBSYMTAB + if (options['g'] && decl_seen) { + C_ms_std((char *) 0, N_RBRAC, brc_level); + } + brc_level--; +#endif /* DBSYMTAB */ + } +; diff --git a/lang/cem/cemcom.ansi/tokcasee.in b/lang/cem/cemcom.ansi/tokcasee.in index 5df07e7c9..df8f6c608 100644 --- a/lang/cem/cemcom.ansi/tokcasee.in +++ b/lang/cem/cemcom.ansi/tokcasee.in @@ -1,16 +1,16 @@ - default: - if (tok <= 0) return "end of file"; - if (tok < 040 || tok >= 0177) { - return "bad token"; - } - /* fall through */ - case '\n': - case '\f': - case '\v': - case '\r': - case '\t': - index = (index+2) & (SIZBUF-1); - buf[index] = tok; - return &buf[index]; - } + default: + if (tok <= 0) return "end of file"; + if (tok < 040 || tok >= 0177) { + return "bad token"; + } + /* fall through */ + case '\n': + case '\f': + case '\v': + case '\r': + case '\t': + index = (index+2) & (SIZBUF-1); + buf[index] = tok; + return &buf[index]; + } } \ No newline at end of file diff --git a/lang/cem/cemcom.ansi/tokcaseh.in b/lang/cem/cemcom.ansi/tokcaseh.in index 63b1932cb..3b3acba22 100644 --- a/lang/cem/cemcom.ansi/tokcaseh.in +++ b/lang/cem/cemcom.ansi/tokcaseh.in @@ -1,12 +1,12 @@ -/* Generated by make.tokcase */ -/* $Id$ */ -#include "Lpars.h" - -char *symbol2str(int tok) -{ -#define SIZBUF 8 - /* allow for a few invocations in f.i. an argument list */ - static char buf[SIZBUF]; - static int index; - - switch (tok) { +/* Generated by make.tokcase */ +/* $Id$ */ +#include "Lpars.h" + +char *symbol2str(int tok) +{ +#define SIZBUF 8 + /* allow for a few invocations in f.i. an argument list */ + static char buf[SIZBUF]; + static int index; + + switch (tok) { diff --git a/lang/cem/cpp.ansi/build.lua b/lang/cem/cpp.ansi/build.lua index 66f1eae84..0ce67c5c7 100644 --- a/lang/cem/cpp.ansi/build.lua +++ b/lang/cem/cpp.ansi/build.lua @@ -58,7 +58,8 @@ normalrule { name = "next_c", ins = { "./make.next", - "./*.str", + "./macro.str", + "./replace.str", }, outleaves = { "next.c" }, commands = { @@ -82,7 +83,22 @@ tabgen { cprogram { name = "cpp", srcs = concat( - "./*.c", + "./ch3bin.c", + "./ch3mon.c", + "./domacro.c", + "./error.c", + "./expr.c", + "./idf.c", + "./init.c", + "./input.c", + "./LLlex.c", + "./LLmessage.c", + "./main.c", + "./options.c", + "./preprocess.c", + "./replace.c", + "./skip.c", + "./tokenname.c", matching(filenamesof(llgen), "%.c$"), "+next_c", "+symbol2str_c", diff --git a/lang/cem/libcc.ansi/build.lua b/lang/cem/libcc.ansi/build.lua index 29c85b351..7b38d82e5 100644 --- a/lang/cem/libcc.ansi/build.lua +++ b/lang/cem/libcc.ansi/build.lua @@ -33,24 +33,163 @@ for _, plat in ipairs(vars.plats) do srcs = { "+ctype_files", "+ctype_tab", - "./core/ctype/*.c", - "./core/errno/*.c", - "./core/locale/*.c", - "./core/math/*.c", - "./core/math/*.e", - "./core/misc/*.c", - "./core/printf/*.c", - "./core/scanf/*.c", - "./core/setjmp/*.c", - "./core/setjmp/*.e", - "./core/stdlib/*.c", - "./core/stdio/*.c", - "./core/string/*.c", - "./core/time/*.c", - "./sys/exit/*.c", - "./sys/malloc/*.c", - "./sys/misc/*.c", - "./sys/stdio/*.c", + "./core/ctype/tolower.c", + "./core/ctype/toupper.c", + "./core/errno/errlist.c", + "./core/errno/perror.c", + "./core/errno/strerror.c", + "./core/locale/localeconv.c", + "./core/locale/setlocale.c", + "./core/math/asin.c", + "./core/math/atan2.c", + "./core/math/atan.c", + "./core/math/ceil.c", + "./core/math/exp.c", + "./core/math/fabs.c", + "./core/math/floor.c", + "./core/math/fmod.c", + "./core/math/frexp.e", + "./core/math/hugeval.c", + "./core/math/hypot.c", + "./core/math/isnan.c", + "./core/math/ldexp.c", + "./core/math/log10.c", + "./core/math/log.c", + "./core/math/modf.e", + "./core/math/pow.c", + "./core/math/sin.c", + "./core/math/sinh.c", + "./core/math/sqrt.c", + "./core/math/tan.c", + "./core/math/tanh.c", + "./core/misc/abort.c", + "./core/misc/assert.c", + "./core/misc/getopt.c", + "./core/misc/raise.c", + "./core/misc/termcap.c", + "./core/printf/doprnt.c", + "./core/printf/fltpr.c", + "./core/printf/fprintf.c", + "./core/printf/icompute.c", + "./core/printf/itoa.c", + "./core/printf/printf.c", + "./core/printf/snprintf.c", + "./core/printf/sprintf.c", + "./core/printf/vfprintf.c", + "./core/printf/vprintf.c", + "./core/printf/vsnprintf.c", + "./core/printf/vsprintf.c", + "./core/scanf/doscan.c", + "./core/scanf/fscanf.c", + "./core/scanf/scanf.c", + "./core/scanf/sscanf.c", + "./core/scanf/vfscanf.c", + "./core/setjmp/setjmp.e", + "./core/setjmp/sigmisc.c", + "./core/stdio/clearerr.c", + "./core/stdio/feof.c", + "./core/stdio/ferror.c", + "./core/stdio/fgetc.c", + "./core/stdio/fgetpos.c", + "./core/stdio/fgets.c", + "./core/stdio/fputc.c", + "./core/stdio/fputs.c", + "./core/stdio/fread.c", + "./core/stdio/fsetpos.c", + "./core/stdio/fwrite.c", + "./core/stdio/getc.c", + "./core/stdio/getchar.c", + "./core/stdio/gets.c", + "./core/stdio/getw.c", + "./core/stdio/putc.c", + "./core/stdio/putchar.c", + "./core/stdio/puts.c", + "./core/stdio/putw.c", + "./core/stdio/rewind.c", + "./core/stdlib/abs.c", + "./core/stdlib/atof.c", + "./core/stdlib/atoi.c", + "./core/stdlib/atol.c", + "./core/stdlib/bsearch.c", + "./core/stdlib/div.c", + "./core/stdlib/ecvt.c", + "./core/stdlib/environ.c", + "./core/stdlib/ext_comp.c", + "./core/stdlib/getenv.c", + "./core/stdlib/labs.c", + "./core/stdlib/ldiv.c", + "./core/stdlib/mblen.c", + "./core/stdlib/mbstowcs.c", + "./core/stdlib/mbtowc.c", + "./core/stdlib/putenv.c", + "./core/stdlib/qsort.c", + "./core/stdlib/rand.c", + "./core/stdlib/setenv.c", + "./core/stdlib/strtod.c", + "./core/stdlib/strtol.c", + "./core/stdlib/wcstombs.c", + "./core/stdlib/wctomb.c", + "./core/string/memchr.c", + "./core/string/memcmp.c", + "./core/string/memcpy.c", + "./core/string/memmove.c", + "./core/string/memset.c", + "./core/string/strcat.c", + "./core/string/strchr.c", + "./core/string/strcmp.c", + "./core/string/strcoll.c", + "./core/string/strcpy.c", + "./core/string/strcspn.c", + "./core/string/strdup.c", + "./core/string/strlen.c", + "./core/string/strncat.c", + "./core/string/strncmp.c", + "./core/string/strncpy.c", + "./core/string/strpbrk.c", + "./core/string/strrchr.c", + "./core/string/strspn.c", + "./core/string/strstr.c", + "./core/string/strtok.c", + "./core/string/strxfrm.c", + "./core/time/asctime.c", + "./core/time/ctime.c", + "./core/time/difftime.c", + "./core/time/gmtime.c", + "./core/time/localtime.c", + "./core/time/misc.c", + "./core/time/mktime.c", + "./core/time/strftime.c", + "./core/time/tzset.c", + "./sys/exit/atexit.c", + "./sys/exit/exit.c", + "./sys/malloc/calloc.c", + "./sys/malloc/malloc.c", + "./sys/malloc/realloc.c", + "./sys/misc/clock.c", + "./sys/misc/getpass.c", + "./sys/misc/isatty.c", + "./sys/misc/mktemp.c", + "./sys/misc/popen.c", + "./sys/misc/remove.c", + "./sys/misc/sleep.c", + "./sys/misc/system.c", + "./sys/misc/time.c", + "./sys/stdio/data.c", + "./sys/stdio/fclose.c", + "./sys/stdio/fdopen.c", + "./sys/stdio/fflush.c", + "./sys/stdio/fileno.c", + "./sys/stdio/fillbuf.c", + "./sys/stdio/flushbuf.c", + "./sys/stdio/fopen.c", + "./sys/stdio/freopen.c", + "./sys/stdio/fseek.c", + "./sys/stdio/ftell.c", + "./sys/stdio/setbuf.c", + "./sys/stdio/setvbuf.c", + "./sys/stdio/tmpfile.c", + "./sys/stdio/tmpnam.c", + "./sys/stdio/ungetc.c", }, hdrs = {}, -- must be empty deps = { diff --git a/lang/cem/libcc.ansi/headers/build.lua b/lang/cem/libcc.ansi/headers/build.lua index 57e4c12ee..99c4162eb 100644 --- a/lang/cem/libcc.ansi/headers/build.lua +++ b/lang/cem/libcc.ansi/headers/build.lua @@ -11,9 +11,38 @@ local function addheader(dir, list) end end -addheader("", filenamesof("./*.h")) -addheader("sys/", filenamesof("./sys/*.h")) -addheader("ack/", filenamesof("./ack/*.h")) +addheader("", filenamesof( + "./assert.h", + "./ctype.h", + "./errno.h", + "./fcntl.h", + "./float.h", + "./iso646.h", + "./limits.h", + "./locale.h", + "./math.h", + "./setjmp.h", + "./signal.h", + "./stdarg.h", + "./stdbool.h", + "./stddef.h", + "./stdint.h", + "./stdio.h", + "./stdlib.h", + "./string.h", + "./time.h", + "./unistd.h" + )) + +addheader("sys/", filenamesof( + "./sys/time.h", + "./sys/times.h" + )) + +addheader("ack/", filenamesof( + "./ack/config.h", + "./ack/emufile.h" + )) acklibrary { name = "headers", diff --git a/lang/m2/comp/LLmessage.c b/lang/m2/comp/LLmessage.c index 5bd17b07a..32bd8787c 100644 --- a/lang/m2/comp/LLmessage.c +++ b/lang/m2/comp/LLmessage.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "parameters.h" #include "idf.h" diff --git a/lang/m2/comp/build.lua b/lang/m2/comp/build.lua index 0c60ffbab..352dd9d6a 100644 --- a/lang/m2/comp/build.lua +++ b/lang/m2/comp/build.lua @@ -15,7 +15,10 @@ llgen { srcs = { -- order here is important "+tokenfile_g", - "./*.g", + "./declar.g", + "./expression.g", + "./program.g", + "./statement.g", } } @@ -31,42 +34,10 @@ normalrule { } } -for _, f in ipairs(filenamesof("./*.xh")) do - local name = replace(basename(f), "%.xh$", "") - normalrule { - name = name.."_h", - ins = { - "./make.allocd", - f - }, - outleaves = { name..".h" }, - commands = { - "%{ins[1]} < %{ins[2]} > %{outs}" - } - } -end - -for _, f in ipairs(filenamesof("./*.xc")) do - local name = replace(basename(f), "%.xc$", "") - normalrule { - name = name.."_c", - ins = { - "./make.allocd", - f - }, - outleaves = { name..".c" }, - commands = { - "%{ins[1]} < %{ins[2]} > %{outs}" - } - } -end - normalrule { name = "next_c", ins = { "./make.next", - "./*.xh", - "./*.xc", }, outleaves = { "next.c" }, commands = { @@ -94,22 +65,39 @@ tabgen { cprogram { name = "em_m2", srcs = { - "./*.c", - "+casestat_c", - "+next_c", - "+scope_c", - "+symbol2str_c", - "+tmpvar_c", "+chartab_c", + "+next_c", + "+symbol2str_c", + "./LLlex.c", + "./LLmessage.c", + "./casestat.c", + "./chk_expr.c", + "./code.c", + "./cstoper.c", + "./def.c", + "./defmodule.c", + "./desig.c", + "./enter.c", + "./error.c", + "./idf.c", + "./input.c", + "./lookup.c", + "./main.c", + "./misc.c", + "./node.c", + "./options.c", + "./scope.c", + "./stab.c", + "./tmpvar.c", + "./tokenname.c", + "./type.c", + "./typequiv.c", + "./walk.c", matching(filenamesof("+llgen"), "%.c$"), }, deps = { - "+def_h", "+llgen", - "+node_h", "+parameters_h", - "+real_h", - "+type_h", "h+emheaders", "lang/m2/include+headers", "modules+headers", diff --git a/lang/m2/comp/casestat.xc b/lang/m2/comp/casestat.c similarity index 97% rename from lang/m2/comp/casestat.xc rename to lang/m2/comp/casestat.c index 345f88b06..76c391d61 100644 --- a/lang/m2/comp/casestat.xc +++ b/lang/m2/comp/casestat.c @@ -19,6 +19,7 @@ #include "parameters.h" #include "debug.h" +#include #include #include "em_label.h" #include "em_arith.h" @@ -50,7 +51,8 @@ struct switch_hdr { */ }; -/* STATICALLOCDEF "switch_hdr" 5 */ +#define new_switch_hdr() ((struct switch_hdr*) calloc(1, sizeof(struct switch_hdr))) +#define free_switch_hdr(p) free(p) struct case_entry { struct case_entry *ce_next; /* next in list */ @@ -60,7 +62,8 @@ struct case_entry { -/* STATICALLOCDEF "case_entry" 20 */ +#define new_case_entry() ((struct case_entry*) calloc(1, sizeof(struct case_entry))) +#define free_case_entry(p) free(p) diff --git a/lang/m2/comp/code.c b/lang/m2/comp/code.c index eaa9da48b..b7cf22a8e 100644 --- a/lang/m2/comp/code.c +++ b/lang/m2/comp/code.c @@ -15,6 +15,7 @@ #include "parameters.h" #include "debug.h" +#include #include #include "em_arith.h" #include "em_label.h" diff --git a/lang/m2/comp/def.xh b/lang/m2/comp/def.h similarity index 97% rename from lang/m2/comp/def.xh rename to lang/m2/comp/def.h index 4c755c681..83e2acdd1 100644 --- a/lang/m2/comp/def.xh +++ b/lang/m2/comp/def.h @@ -132,7 +132,8 @@ struct def { /* list of definitions for a name */ }; -/* ALLOCDEF "def" 50 */ +#define new_def() ((struct def*) calloc(1, sizeof(struct def))) +#define free_def(p) free(p) #define NULLDEF ((struct def *) 0) @@ -150,4 +151,4 @@ struct def * DefineLocalModule(struct idf *id); void CheckWithDef(register struct def *df, struct type *tp); void end_definition_list(register struct def **pdf); -#endif /* DEF_H_ */ \ No newline at end of file +#endif /* DEF_H_ */ diff --git a/lang/m2/comp/desig.c b/lang/m2/comp/desig.c index 0925ca8cb..24fe41e05 100644 --- a/lang/m2/comp/desig.c +++ b/lang/m2/comp/desig.c @@ -19,6 +19,7 @@ #include "parameters.h" #include "debug.h" +#include #include #include "em_arith.h" #include "em_label.h" diff --git a/lang/m2/comp/error.c b/lang/m2/comp/error.c index 106abdbc2..925131cc7 100644 --- a/lang/m2/comp/error.c +++ b/lang/m2/comp/error.c @@ -23,6 +23,7 @@ #include #endif +#include #include #include #include diff --git a/lang/m2/comp/lookup.c b/lang/m2/comp/lookup.c index 3938659bc..2fcf35779 100644 --- a/lang/m2/comp/lookup.c +++ b/lang/m2/comp/lookup.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "lookup.h" #include "LLlex.h" diff --git a/lang/m2/comp/main.c b/lang/m2/comp/main.c index 28677eab6..31c8621fc 100644 --- a/lang/m2/comp/main.c +++ b/lang/m2/comp/main.c @@ -13,6 +13,7 @@ #include "debug.h" #include +#include #include "system.h" #include "em_arith.h" #include "em_label.h" diff --git a/lang/m2/comp/make.allocd b/lang/m2/comp/make.allocd deleted file mode 100755 index e3077691d..000000000 --- a/lang/m2/comp/make.allocd +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -sed -e ' -s:^.*[ ]ALLOCDEF[ ].*"\(.*\)"[ ]*\([0-9][0-9]*\).*$:\ -/* allocation definitions of struct \1 */\ -extern char *st_alloc();\ -extern struct \1 *h_\1;\ -#ifdef DEBUG\ -extern int cnt_\1;\ -extern char *std_alloc();\ -#define new_\1() ((struct \1 *) std_alloc((char **)\&h_\1, sizeof(struct \1), \2, \&cnt_\1))\ -#else\ -#define new_\1() ((struct \1 *) st_alloc((char **)\&h_\1, sizeof(struct \1), \2))\ -#endif\ -#define free_\1(p) st_free(p, \&h_\1, sizeof(struct \1))\ -:' -e ' -s:^.*[ ]STATICALLOCDEF[ ].*"\(.*\)"[ ]*\([0-9][0-9]*\).*$:\ -/* allocation definitions of struct \1 */\ -extern char *st_alloc();\ -struct \1 *h_\1;\ -#ifdef DEBUG\ -int cnt_\1;\ -#define new_\1() ((struct \1 *) std_alloc((char **)\&h_\1, sizeof(struct \1), \2, \&cnt_\1))\ -#else\ -#define new_\1() ((struct \1 *) st_alloc((char **)\&h_\1, sizeof(struct \1), \2))\ -#endif\ -#define free_\1(p) st_free(p, \&h_\1, sizeof(struct \1))\ -:' diff --git a/lang/m2/comp/make.hfiles b/lang/m2/comp/make.hfiles deleted file mode 100755 index 3bc972faf..000000000 --- a/lang/m2/comp/make.hfiles +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh -: Update Files from database - -PATH=/bin:/usr/bin - -case $# in -1) ;; -*) echo use: $0 file >&2 - exit 1 -esac - -( -IFCOMMAND="if [ -r \$FN ] ;\ - then if cmp -s \$FN \$TMP;\ - then rm \$TMP;\ - else mv \$TMP \$FN;\ - echo update \$FN;\ - fi;\ - else mv \$TMP \$FN;\ - echo create \$FN;\ - fi" -echo 'TMP=.uf$$' -echo 'FN=$TMP' -echo 'cat >$TMP <<\!EOF!' -sed -n '/^!File:/,${ -/^$/d -/^!File:[ ]*\(.*\)$/s@@!EOF!\ -'"$IFCOMMAND"'\ -FN=\1\ -cat >$TMP <<\\!EOF!@ -p -}' $1 -echo '!EOF!' -echo $IFCOMMAND -) | eval "$(cat)" diff --git a/lang/m2/comp/node.c b/lang/m2/comp/node.c index 100ec1abc..c0928ef65 100644 --- a/lang/m2/comp/node.c +++ b/lang/m2/comp/node.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "LLlex.h" #include "def.h" diff --git a/lang/m2/comp/node.xh b/lang/m2/comp/node.h similarity index 94% rename from lang/m2/comp/node.xh rename to lang/m2/comp/node.h index 27c3cf087..5a6803b98 100644 --- a/lang/m2/comp/node.xh +++ b/lang/m2/comp/node.h @@ -52,9 +52,8 @@ struct node { #define nd_RVAL nd_token.TOK_RVAL }; - - -/* ALLOCDEF "node" 50 */ +#define new_node() ((struct node*) calloc(1, sizeof(struct node))) +#define free_node(p) free(p) extern struct node *dot2node(), *dot2leaf(), *getnode(); @@ -76,4 +75,4 @@ void FreeNode(register struct node *nd); int NodeCrash(register struct node* expp, label exit_label, int end_reached); int PNodeCrash(struct node **expp, int flags); -#endif /* NODE_H_ */ \ No newline at end of file +#endif /* NODE_H_ */ diff --git a/lang/m2/comp/options.c b/lang/m2/comp/options.c index 41bb9629c..a0e04e1a2 100644 --- a/lang/m2/comp/options.c +++ b/lang/m2/comp/options.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "type.h" #include "main.h" diff --git a/lang/m2/comp/proto.make b/lang/m2/comp/proto.make deleted file mode 100644 index e544e84ca..000000000 --- a/lang/m2/comp/proto.make +++ /dev/null @@ -1,158 +0,0 @@ -# $Id$ - -# make Modula-2 compiler - -#PARAMS do not remove this line! - -UTIL_BIN = \ - $(UTIL_HOME)/bin -SRC_DIR = \ - $(SRC_HOME)/lang/m2/comp - -TABGEN= $(UTIL_BIN)/tabgen -LLGEN = $(UTIL_BIN)/LLgen -LLGENOPTIONS = \ - -n - -SRC_G = $(SRC_DIR)/program.g $(SRC_DIR)/declar.g \ - $(SRC_DIR)/expression.g $(SRC_DIR)/statement.g -GEN_G = tokenfile.g -GFILES= $(GEN_G) $(SRC_G) - -SRC_C = $(SRC_DIR)/LLlex.c $(SRC_DIR)/LLmessage.c $(SRC_DIR)/error.c \ - $(SRC_DIR)/main.c $(SRC_DIR)/tokenname.c $(SRC_DIR)/idf.c \ - $(SRC_DIR)/input.c $(SRC_DIR)/type.c $(SRC_DIR)/def.c \ - $(SRC_DIR)/misc.c $(SRC_DIR)/enter.c $(SRC_DIR)/defmodule.c \ - $(SRC_DIR)/typequiv.c $(SRC_DIR)/node.c $(SRC_DIR)/cstoper.c \ - $(SRC_DIR)/chk_expr.c $(SRC_DIR)/options.c $(SRC_DIR)/walk.c \ - $(SRC_DIR)/desig.c $(SRC_DIR)/code.c $(SRC_DIR)/lookup.c \ - $(SRC_DIR)/stab.c -GEN_C = tokenfile.c program.c declar.c expression.c statement.c \ - symbol2str.c char.c Lpars.c Lncor.c casestat.c tmpvar.c scope.c next.c -CFILES= $(SRC_C) $(GEN_C) - -SRC_H = $(SRC_DIR)/LLlex.h $(SRC_DIR)/chk_expr.h $(SRC_DIR)/class.h \ - $(SRC_DIR)/debug.h $(SRC_DIR)/desig.h $(SRC_DIR)/f_info.h \ - $(SRC_DIR)/idf.h $(SRC_DIR)/input.h $(SRC_DIR)/main.h \ - $(SRC_DIR)/misc.h $(SRC_DIR)/scope.h $(SRC_DIR)/standards.h \ - $(SRC_DIR)/tokenname.h $(SRC_DIR)/walk.h $(SRC_DIR)/warning.h \ - $(SRC_DIR)/SYSTEM.h -GEN_H = errout.h idfsize.h numsize.h strsize.h target_sizes.h bigresult.h \ - inputtype.h density.h squeeze.h nocross.h nostrict.h def.h debugcst.h \ - type.h Lpars.h node.h strict3rd.h real.h use_insert.h dbsymtab.h \ - uns_arith.h def.h type.h node.h real.h -HFILES= $(GEN_H) $(SRC_H) - -NEXTFILES = \ - $(SRC_DIR)/def.H $(SRC_DIR)/type.H $(SRC_DIR)/node.H $(SRC_DIR)/real.H \ - $(SRC_DIR)/scope.C $(SRC_DIR)/tmpvar.C $(SRC_DIR)/casestat.C - -all: make.main - make -f make.main main - -install: all - cp main $(TARGET_HOME)/lib.bin/em_m2 - if [ $(DO_MACHINE_INDEP) = y ] ; \ - then mk_manpage $(SRC_DIR)/em_m2.6 $(TARGET_HOME) ; \ - mk_manpage $(SRC_DIR)/modula-2.1 $(TARGET_HOME) ; \ - fi - -cmp: all - -cmp main $(TARGET_HOME)/lib.bin/em_m2 - -opr: - make pr | opr - -pr: - @pr $(SRC_DIR)/proto.make $(SRC_DIR)/proto.main Parameters \ - $(SRC_DIR)/char.tab $(SRC_G) $(SRC_H) $(NEXTFILES) $(SRC_C) - -lint: make.main - make -f make.main lint - -Cfiles: hfiles LLfiles $(GEN_C) $(GEN_H) Makefile - echo $(CFILES) | tr ' ' '\012' > Cfiles - echo $(HFILES) | tr ' ' '\012' >> Cfiles - -resolved: Cfiles - CC="$(CC)" UTIL_HOME="$(UTIL_HOME)" do_resolve `cat Cfiles` > Cfiles.new - -if cmp -s Cfiles Cfiles.new ; then rm -f Cfiles.new ; else mv Cfiles.new Cfiles ; fi - touch resolved - -# there is no file called "dependencies"; we want dependencies checked -# every time. This means that make.main is made every time. Oh well ... -# it does not take much time. -dependencies: resolved - do_deps `grep '.c$$' Cfiles` - -make.main: dependencies make_macros lists $(SRC_DIR)/proto.main - rm_deps $(SRC_DIR)/proto.main | sed -e '/^.PARAMS/r make_macros' -e '/^.LISTS/r lists' > make.main - cat *.dep >> make.main - -make_macros: Makefile - echo 'SRC_DIR=$(SRC_DIR)' > make_macros - echo 'UTIL_HOME=$(UTIL_HOME)' >> make_macros - echo 'TARGET_HOME=$(TARGET_HOME)' >> make_macros - echo 'CC=$(CC)' >> make_macros - echo 'COPTIONS=$(COPTIONS)' >> make_macros - echo 'LDOPTIONS=$(LDOPTIONS)' >> make_macros - echo 'LINT=$(LINT)' >> make_macros - echo 'LINTSUF=$(LINTSUF)' >> make_macros - echo 'LINTPREF=$(LINTPREF)' >> make_macros - echo 'LINTOPTIONS=$(LINTOPTIONS)' >> make_macros - echo 'SUF=$(SUF)' >> make_macros - echo 'LIBSUF=$(LIBSUF)' >> make_macros - echo 'CC_AND_MKDEP=$(CC_AND_MKDEP)' >> make_macros - -lists: Cfiles - echo "C_SRC = \\" > lists - echo $(CFILES) >> lists - echo "OBJ = \\" >> lists - echo $(CFILES) | sed -e 's|[^ ]*/||g' -e 's/\.c/.$$(SUF)/g' >> lists - -clean: - -make -f make.main clean - rm -f $(GEN_C) $(GEN_G) $(GEN_H) hfiles LLfiles Cfiles LL.output - rm -f resolved *.dep lists make.main make_macros - -LLfiles: $(GFILES) - $(LLGEN) $(LLGENOPTIONS) $(GFILES) - @touch LLfiles - @if [ -f Lncor.c ] ; then : ; else touch Lncor.c ; fi - -hfiles: Parameters $(SRC_DIR)/make.hfiles - $(SRC_DIR)/make.hfiles Parameters - touch hfiles - -tokenfile.g: $(SRC_DIR)/tokenname.c $(SRC_DIR)/make.tokfile - $(SRC_DIR)/make.tokfile <$(SRC_DIR)/tokenname.c >tokenfile.g - -symbol2str.c: $(SRC_DIR)/tokenname.c $(SRC_DIR)/make.tokcase - $(SRC_DIR)/make.tokcase <$(SRC_DIR)/tokenname.c >symbol2str.c - -def.h: $(SRC_DIR)/make.allocd $(SRC_DIR)/def.H - $(SRC_DIR)/make.allocd < $(SRC_DIR)/def.H > def.h - -type.h: $(SRC_DIR)/make.allocd $(SRC_DIR)/type.H - $(SRC_DIR)/make.allocd < $(SRC_DIR)/type.H > type.h - -real.h: $(SRC_DIR)/make.allocd $(SRC_DIR)/real.H - $(SRC_DIR)/make.allocd < $(SRC_DIR)/real.H > real.h - -node.h: $(SRC_DIR)/make.allocd $(SRC_DIR)/node.H - $(SRC_DIR)/make.allocd < $(SRC_DIR)/node.H > node.h - -scope.c: $(SRC_DIR)/make.allocd $(SRC_DIR)/scope.C - $(SRC_DIR)/make.allocd < $(SRC_DIR)/scope.C > scope.c - -tmpvar.c: $(SRC_DIR)/make.allocd $(SRC_DIR)/tmpvar.C - $(SRC_DIR)/make.allocd < $(SRC_DIR)/tmpvar.C > tmpvar.c - -casestat.c: $(SRC_DIR)/make.allocd $(SRC_DIR)/casestat.C - $(SRC_DIR)/make.allocd < $(SRC_DIR)/casestat.C > casestat.c - -next.c: $(NEXTFILES) $(SRC_DIR)/make.next - $(SRC_DIR)/make.next $(NEXTFILES) > next.c - -char.c: $(SRC_DIR)/char.tab - $(TABGEN) -f$(SRC_DIR)/char.tab >char.c diff --git a/lang/m2/comp/real.xh b/lang/m2/comp/real.h similarity index 79% rename from lang/m2/comp/real.xh rename to lang/m2/comp/real.h index 5a65fdc91..3d4fa839a 100644 --- a/lang/m2/comp/real.xh +++ b/lang/m2/comp/real.h @@ -16,4 +16,5 @@ struct real { flt_arith r_val; }; -/* ALLOCDEF "real" 20 */ +#define new_real() ((struct real*) calloc(1, sizeof(struct real))) +#define free_real(p) free(p) diff --git a/lang/m2/comp/scope.xc b/lang/m2/comp/scope.c similarity index 95% rename from lang/m2/comp/scope.xc rename to lang/m2/comp/scope.c index 9fa1ca7d5..d80988d72 100644 --- a/lang/m2/comp/scope.xc +++ b/lang/m2/comp/scope.c @@ -12,6 +12,7 @@ #include "parameters.h" #include "debug.h" +#include #include #include "alloc.h" #include "em_arith.h" @@ -31,9 +32,11 @@ struct scopelist *CurrVis, *GlobalVis; extern int proclevel; extern char options[]; -/* STATICALLOCDEF "scope" 10 */ +#define new_scope() ((struct scope*) calloc(1, sizeof(struct scope))) +#define free_scope(p) free(p) -/* STATICALLOCDEF "scopelist" 10 */ +#define new_scopelist() ((struct scopelist*) calloc(1, sizeof(struct scopelist))) +#define free_scopelist(p) free(p) static int sc_count; diff --git a/lang/m2/comp/tmpvar.xc b/lang/m2/comp/tmpvar.c similarity index 94% rename from lang/m2/comp/tmpvar.xc rename to lang/m2/comp/tmpvar.c index 980cfadc3..d2224a6b8 100644 --- a/lang/m2/comp/tmpvar.xc +++ b/lang/m2/comp/tmpvar.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "LLlex.h" #include "def.h" @@ -32,13 +33,15 @@ #include "scope.h" #include "tmpvar.h" #include "main.h" +#include "tmpvar.h" struct tmpvar { struct tmpvar *t_next; arith t_offset; /* offset from LocalBase */ }; -/* STATICALLOCDEF "tmpvar" 10 */ +#define new_tmpvar() ((struct tmpvar*) calloc(1, sizeof(struct tmpvar))) +#define free_tmpvar(p) free(p) static struct tmpvar *TmpInts, /* for integer temporaries */ *TmpPtrs; /* for pointer temporaries */ diff --git a/lang/m2/comp/tokenname.c b/lang/m2/comp/tokenname.c index d21ffda48..604ce8c16 100644 --- a/lang/m2/comp/tokenname.c +++ b/lang/m2/comp/tokenname.c @@ -9,6 +9,7 @@ /* $Id$ */ +#include #include "parameters.h" #include "tokenname.h" #include "Lpars.h" diff --git a/lang/m2/comp/type.c b/lang/m2/comp/type.c index dc1c6050c..5ba4a6aef 100644 --- a/lang/m2/comp/type.c +++ b/lang/m2/comp/type.c @@ -12,6 +12,7 @@ #include "parameters.h" #include "debug.h" +#include #include #include #include diff --git a/lang/m2/comp/type.xh b/lang/m2/comp/type.h similarity index 93% rename from lang/m2/comp/type.xh rename to lang/m2/comp/type.h index 98b14f3ca..72f2a4d70 100644 --- a/lang/m2/comp/type.xh +++ b/lang/m2/comp/type.h @@ -24,8 +24,8 @@ struct paramlist { /* structure for parameterlist of a PROCEDURE */ }; struct paramlist; - -/* ALLOCDEF "paramlist" 20 */ +#define new_paramlist() ((struct paramlist*) calloc(1, sizeof(struct paramlist))) +#define free_paramlist(p) free(p) struct enume { struct def *en_enums; /* Definitions of enumeration literals */ @@ -36,7 +36,8 @@ struct enume { #define enm_rck tp_value.tp_enum->en_rck }; -/* ALLOCDEF "enume" 5 */ +#define new_enume() ((struct enume*) calloc(1, sizeof(struct enume))) +#define free_enume(p) free(p) struct subrange { arith su_lb, su_ub; /* lower bound and upper bound */ @@ -46,7 +47,8 @@ struct subrange { #define sub_rck tp_value.tp_subrange->su_rck }; -/* ALLOCDEF "subrange" 5 */ +#define new_subrange() ((struct subrange*) calloc(1, sizeof(struct subrange))) +#define free_subrange(p) free(p) struct array { struct type *ar_elem; /* type of elements */ @@ -61,7 +63,8 @@ struct array { #define arr_high tp_value.tp_arr->ar_high }; -/* ALLOCDEF "array" 5 */ +#define new_array() ((struct array*) calloc(1, sizeof(struct array))) +#define free_array(p) free(p) struct record { struct scope *rc_scope; /* scope of this record */ @@ -126,7 +129,8 @@ struct type { struct type; -/* ALLOCDEF "type" 50 */ +#define new_type() ((struct type*) calloc(1, sizeof(struct type))) +#define free_type(p) free(p) extern struct type *bool_type, @@ -290,4 +294,4 @@ int lcm(int m, int n); -#endif /* TYPE_H_ */ \ No newline at end of file +#endif /* TYPE_H_ */ diff --git a/lang/m2/comp/typequiv.c b/lang/m2/comp/typequiv.c index b622fa3b2..545b8df1a 100644 --- a/lang/m2/comp/typequiv.c +++ b/lang/m2/comp/typequiv.c @@ -15,6 +15,7 @@ #include "parameters.h" #include "debug.h" +#include #include #include #include diff --git a/lang/m2/include/build.lua b/lang/m2/include/build.lua index 24f43084a..096e9441c 100644 --- a/lang/m2/include/build.lua +++ b/lang/m2/include/build.lua @@ -1,4 +1,7 @@ clibrary { name = "headers", - hdrs = {"./*.h"} + hdrs = { + "./libm2.h", + "./m2_traps.h", + } } diff --git a/lang/m2/libm2/build.lua b/lang/m2/libm2/build.lua index 2efe707ae..90bad0f4c 100644 --- a/lang/m2/libm2/build.lua +++ b/lang/m2/libm2/build.lua @@ -9,7 +9,34 @@ local function addheader(dir, list) end end -addheader("", filenamesof("./*.def")) +addheader("", filenamesof( + "./Arguments.def", + "./ArraySort.def", + "./ASCII.def", + "./Conversions.def", + "./CSP.def", + "./EM.def", + "./Epilogue.def", + "./InOut.def", + "./MathLib0.def", + "./Mathlib.def", + "./PascalIO.def", + "./Processes.def", + "./random.def", + "./RealConversions.def", + "./RealInOut.def", + "./Semaphores.def", + "./Storage.def", + "./Streams.def", + "./Strings.def", + "./StripUnix.def", + "./Termcap.def", + "./Terminal.def", + "./Traps.def", + "./Unix.def", + "./XXTermcap.def" + )) + installable { name = "headers", @@ -20,8 +47,47 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, srcs = { - "./*.c", - "./*.mod", + "./absd.c", + "./absi.c", + "./absl.c", + "./Arguments.c", + "./ArraySort.mod", + "./blockmove.c", + "./cap.c", + "./catch.c", + "./confarray.c", + "./Conversions.mod", + "./CSP.mod", + "./dvi.c", + "./halt.c", + "./init.c", + "./InOut.mod", + "./load.c", + "./MathLib0.mod", + "./Mathlib.mod", + "./PascalIO.mod", + "./Processes.mod", + "./random.mod", + "./rcka.c", + "./rcki.c", + "./rckil.c", + "./rcku.c", + "./rckul.c", + "./RealConversions.mod", + "./RealInOut.mod", + "./Semaphores.mod", + "./sigtrp.c", + "./stackprio.c", + "./Storage.mod", + "./store.c", + "./StrAss.c", + "./Streams.mod", + "./Strings.mod", + "./SYSTEM.c", + "./Termcap.mod", + "./Terminal.mod", + "./Traps.mod", + "./ucheck.c", "./EM.e", "./LtoUset.e", "./absf.e", diff --git a/lang/pc/comp/build.lua b/lang/pc/comp/build.lua index 740f88f43..2aff76538 100644 --- a/lang/pc/comp/build.lua +++ b/lang/pc/comp/build.lua @@ -15,7 +15,10 @@ llgen { srcs = { -- order here is important "+tokenfile_g", - "./*.g", + "./declar.g", + "./expression.g", + "./program.g", + "./statement.g", } } @@ -31,7 +34,15 @@ normalrule { } } -for _, f in ipairs(filenamesof("./*.xh")) do +local xh_files = { + "./def.xh", + "./desig.xh", + "./node.xh", + "./scope.xh", + "./type.xh", +} + +for _, f in ipairs(filenamesof(xh_files)) do local name = replace(basename(f), "%.xh$", "") normalrule { name = name.."_h", @@ -46,7 +57,12 @@ for _, f in ipairs(filenamesof("./*.xh")) do } end -for _, f in ipairs(filenamesof("./*.xc")) do +local xc_files = { + "./casestat.xc", + "./tmpvar.xc", +} + +for _, f in ipairs(filenamesof(xc_files)) do local name = replace(basename(f), "%.xc$", "") normalrule { name = name.."_c", @@ -65,8 +81,8 @@ normalrule { name = "next_c", ins = { "./make.next", - "./*.xh", - "./*.xc", + xh_files, + xc_files }, outleaves = { "next.c" }, commands = { @@ -94,7 +110,31 @@ tabgen { cprogram { name = "em_pc", srcs = { - "./*.c", + "./body.c", + "./chk_expr.c", + "./code.c", + "./cstoper.c", + "./def.c", + "./desig.c", + "./enter.c", + "./error.c", + "./idf.c", + "./input.c", + "./label.c", + "./LLlex.c", + "./LLmessage.c", + "./lookup.c", + "./main.c", + "./misc.c", + "./node.c", + "./options.c", + "./progs.c", + "./readwrite.c", + "./scope.c", + "./stab.c", + "./tokenname.c", + "./type.c", + "./typequiv.c", "+casestat_c", "+chartab_c", "+next_c", diff --git a/lang/pc/include/build.lua b/lang/pc/include/build.lua index 24f43084a..d4fac6203 100644 --- a/lang/pc/include/build.lua +++ b/lang/pc/include/build.lua @@ -1,4 +1,9 @@ clibrary { name = "headers", - hdrs = {"./*.h"} + hdrs = { + "./pc_err.h", + "./pc_file.h", + "./pc.h", + "./pc_math.h", + } } diff --git a/lang/pc/libpc/build.lua b/lang/pc/libpc/build.lua index 08c3ef187..42fe7a5c8 100644 --- a/lang/pc/libpc/build.lua +++ b/lang/pc/libpc/build.lua @@ -4,7 +4,66 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, srcs = { - "./*.c", + "./abi.c", + "./abl.c", + "./abr.c", + "./arg.c", + "./ass.c", + "./asz.c", + "./atn.c", + "./bcp.c", + "./buff.c", + "./catch.c", + "./cls.c", + "./cvt.c", + "./diag.c", + "./efl.c", + "./eln.c", + "./exp.c", + "./get.c", + "./hlt.c", + "./incpt.c", + "./ini.c", + "./log.c", + "./mdi.c", + "./mdl.c", + "./new.c", + "./nfa.c", + "./nobuff.c", + "./notext.c", + "./opn.c", + "./outcpt.c", + "./pac.c", + "./pclose.c", + "./pcreat.c", + "./pentry.c", + "./perrno.c", + "./pexit.c", + "./popen.c", + "./put.c", + "./rcka.c", + "./rdc.c", + "./rdi.c", + "./rdl.c", + "./rdr.c", + "./rf.c", + "./rln.c", + "./rnd.c", + "./sin.c", + "./sqt.c", + "./string.c", + "./unp.c", + "./uread.c", + "./uwrite.c", + "./wdw.c", + "./wf.c", + "./wrc.c", + "./wrf.c", + "./wri.c", + "./wrl.c", + "./wrr.c", + "./wrs.c", + "./wrz.c", "./bts.e", "./encaps.e", "./fef.e", diff --git a/mach/arm/cv/cv.c b/mach/arm/cv/cv.c index 1d0276845..2f4d89389 100644 --- a/mach/arm/cv/cv.c +++ b/mach/arm/cv/cv.c @@ -93,12 +93,12 @@ main(argc, argv) } switch (argc) { case 1: break; - case 3: if ((output = fopen(argv[2], "w")) == (FILE *)0) + case 3: if ((output = fopen(argv[2], "wb")) == (FILE *)0) fatal("Can't write %s.\n", argv[2]); ofile = argv[2]; ofile_created = 1; /* FALLTHROUGH */ - case 2: if ((input = fopen(argv[1], "r")) == (FILE *)0) + case 2: if ((input = fopen(argv[1], "rb")) == (FILE *)0) fatal("Can't read %s.\n", argv[1]); break; default:fatal("Usage: %s .\n", argv[0]); diff --git a/mach/em22/libem/build.lua b/mach/em22/libem/build.lua index c786a6566..f7a23933b 100644 --- a/mach/em22/libem/build.lua +++ b/mach/em22/libem/build.lua @@ -1,7 +1,7 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.e" }, + srcs = { "./dummy.e", }, vars = { plat = plat }, } end diff --git a/mach/em22/libend/build.lua b/mach/em22/libend/build.lua index c786a6566..05ab3319d 100644 --- a/mach/em22/libend/build.lua +++ b/mach/em22/libend/build.lua @@ -1,7 +1,12 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.e" }, + srcs = { + "./edata.e", + "./em_end.e", + "./end.e", + "./etext.e", + }, vars = { plat = plat }, } end diff --git a/mach/i386/as/build.lua b/mach/i386/as/build.lua new file mode 100644 index 000000000..788b76863 --- /dev/null +++ b/mach/i386/as/build.lua @@ -0,0 +1,12 @@ +bundle { + name = "headers", + srcs = { + "./mach0.c", + "./mach1.c", + "./mach2.c", + "./mach3.c", + "./mach4.c", + "./mach5.c", + } +} + diff --git a/mach/i386/libem/build.lua b/mach/i386/libem/build.lua index 6d4322a9c..9dfe8b85b 100644 --- a/mach/i386/libem/build.lua +++ b/mach/i386/libem/build.lua @@ -1,7 +1,59 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, -- csb8.s + srcs = { + "./adi.s", + "./and.s", + "./blm.s", + "./cii.s", + "./cms.s", + "./com.s", + "./csa4.s", + "./csa8.s", + "./csb4.s", + "./csb8.s", + "./cuu.s", + "./divrem8.s", + "./dup.s", + "./dvi8.s", + "./dvi.s", + "./dvu8.s", + "./dvu.s", + "./error.s", + "./exg.s", + "./fat.s", + "./fp8087.s", + "./gto.s", + "./iaar.s", + "./ilar.s", + "./inn.s", + "./ior.s", + "./isar.s", + "./lar4.s", + "./loi.s", + "./mli8.s", + "./mli.s", + "./mon.s", + "./ngi.s", + "./nop.s", + "./print.s", + "./rck.s", + "./rmi8.s", + "./rmi.s", + "./rmu.s", + "./rol.s", + "./ror.s", + "./sar4.s", + "./sbi.s", + "./set.s", + "./sli.s", + "./sri.s", + "./sti.s", + "./strhp.s", + "./trp.s", + "./unknown.s", + "./xor.s", + }, vars = { plat = plat }, } end diff --git a/mach/i386/libend/build.lua b/mach/i386/libend/build.lua index ca5a13c65..bfbf21cd0 100644 --- a/mach/i386/libend/build.lua +++ b/mach/i386/libend/build.lua @@ -1,7 +1,12 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./edata.s", + "./em_end.s", + "./end.s", + "./etext.s", + }, vars = { plat = plat }, } end diff --git a/mach/i386/ncg/build.lua b/mach/i386/ncg/build.lua new file mode 100644 index 000000000..cc47f9b7b --- /dev/null +++ b/mach/i386/ncg/build.lua @@ -0,0 +1,8 @@ +bundle { + name = "headers", + srcs = { + "./mach.c", + "./mach.h" + } +} + diff --git a/mach/i80/as/build.lua b/mach/i80/as/build.lua new file mode 100644 index 000000000..788b76863 --- /dev/null +++ b/mach/i80/as/build.lua @@ -0,0 +1,12 @@ +bundle { + name = "headers", + srcs = { + "./mach0.c", + "./mach1.c", + "./mach2.c", + "./mach3.c", + "./mach4.c", + "./mach5.c", + } +} + diff --git a/mach/i80/libem/build.lua b/mach/i80/libem/build.lua index 45a32ba94..f809b94f4 100644 --- a/mach/i80/libem/build.lua +++ b/mach/i80/libem/build.lua @@ -58,7 +58,52 @@ end for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = concat("./*.s", generated), + srcs = { + "./aar2.s", + "./adi4.s", + "./and.s", + "./blm.s", + "./cii.s", + "./cmi4.s", + "./cmps_mag.s", + "./cmpu_mag.s", + "./cms.s", + "./com.s", + "./csa.s", + "./csb.s", + "./dup.s", + "./dvi2.s", + "./dvi4.s", + "./exg.s", + "./flp.s", + "./inn.s", + "./ior.s", + "./lar2.s", + "./loi.s", + "./mli2.s", + "./mli4.s", + "./mlu2.s", + "./ngi4.s", + "./nop.s", + "./pchl.s", + "./pro.s", + "./rck.s", + "./ret.s", + "./rol4.s", + "./ror4.s", + "./rst.s", + "./sar2.s", + "./sbi4.s", + "./set2.s", + "./set.s", + "./sli2.s", + "./sli4.s", + "./sri2.s", + "./sri4.s", + "./sti.s", + "./xor.s", + generated + }, vars = { plat = plat, ["+ackcflags"] = {"-Imach/i80/libem"} diff --git a/mach/i80/libend/build.lua b/mach/i80/libend/build.lua index ca5a13c65..bfbf21cd0 100644 --- a/mach/i80/libend/build.lua +++ b/mach/i80/libend/build.lua @@ -1,7 +1,12 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./edata.s", + "./em_end.s", + "./end.s", + "./etext.s", + }, vars = { plat = plat }, } end diff --git a/mach/i80/ncg/build.lua b/mach/i80/ncg/build.lua new file mode 100644 index 000000000..cc47f9b7b --- /dev/null +++ b/mach/i80/ncg/build.lua @@ -0,0 +1,8 @@ +bundle { + name = "headers", + srcs = { + "./mach.c", + "./mach.h" + } +} + diff --git a/mach/i86/as/build.lua b/mach/i86/as/build.lua new file mode 100644 index 000000000..788b76863 --- /dev/null +++ b/mach/i86/as/build.lua @@ -0,0 +1,12 @@ +bundle { + name = "headers", + srcs = { + "./mach0.c", + "./mach1.c", + "./mach2.c", + "./mach3.c", + "./mach4.c", + "./mach5.c", + } +} + diff --git a/mach/i86/cv/cv.c b/mach/i86/cv/cv.c index 028d77bac..7f329ad6e 100644 --- a/mach/i86/cv/cv.c +++ b/mach/i86/cv/cv.c @@ -102,7 +102,7 @@ main(argc, argv) switch (argc) { case 1: rd_fdopen(0); break; - case 3: if ((output = fopen(argv[2], "w")) == 0) { + case 3: if ((output = fopen(argv[2], "wb")) == 0) { fatal("Can't write %s.\n", argv[2]); } output_file = argv[2]; diff --git a/mach/i86/libem/build.lua b/mach/i86/libem/build.lua index ca5a13c65..db45ca763 100644 --- a/mach/i86/libem/build.lua +++ b/mach/i86/libem/build.lua @@ -1,7 +1,67 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./adi.s", + "./and.s", + "./blm.s", + "./cii.s", + "./cmi4.s", + "./cms.s", + "./cmu4.s", + "./com.s", + "./csa2.s", + "./csa4.s", + "./csb2.s", + "./csb4.s", + "./cuu.s", + "./dup.s", + "./dvi4.s", + "./dvi.s", + "./dvu4.s", + "./dvu.s", + "./error.s", + "./exg.s", + "./fat.s", + "./fp8087.s", + "./gto.s", + "./iaar.s", + "./ilar.s", + "./inn.s", + "./ior.s", + "./isar.s", + "./lar2.s", + "./lfr6.s", + "./lfr8.s", + "./loi.s", + "./mli4.s", + "./mli.s", + "./mon.s", + "./ngi.s", + "./nop.s", + "./print.s", + "./rck.s", + "./ret6.s", + "./ret8.s", + "./retarea.s", + "./return.s", + "./rmi4.s", + "./rmi.s", + "./rmu4.s", + "./rmu.s", + "./rol.s", + "./ror.s", + "./sar2.s", + "./sbi.s", + "./set.s", + "./sli.s", + "./sri.s", + "./sti.s", + "./strhp.s", + "./trp.s", + "./unknown.s", + "./xor.s", + }, vars = { plat = plat }, } end diff --git a/mach/i86/libend/build.lua b/mach/i86/libend/build.lua index ca5a13c65..bfbf21cd0 100644 --- a/mach/i86/libend/build.lua +++ b/mach/i86/libend/build.lua @@ -1,7 +1,12 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./edata.s", + "./em_end.s", + "./end.s", + "./etext.s", + }, vars = { plat = plat }, } end diff --git a/mach/i86/ncg/build.lua b/mach/i86/ncg/build.lua new file mode 100644 index 000000000..cc47f9b7b --- /dev/null +++ b/mach/i86/ncg/build.lua @@ -0,0 +1,8 @@ +bundle { + name = "headers", + srcs = { + "./mach.c", + "./mach.h" + } +} + diff --git a/mach/m68020/as/build.lua b/mach/m68020/as/build.lua new file mode 100644 index 000000000..788b76863 --- /dev/null +++ b/mach/m68020/as/build.lua @@ -0,0 +1,12 @@ +bundle { + name = "headers", + srcs = { + "./mach0.c", + "./mach1.c", + "./mach2.c", + "./mach3.c", + "./mach4.c", + "./mach5.c", + } +} + diff --git a/mach/m68020/cv/cv.c b/mach/m68020/cv/cv.c index 0ef5cc55d..e28908690 100644 --- a/mach/m68020/cv/cv.c +++ b/mach/m68020/cv/cv.c @@ -141,12 +141,12 @@ main(argc, argv) } switch (argc) { case 1: break; - case 3: if ((output = fopen(argv[2], "w")) == (FILE *)0) + case 3: if ((output = fopen(argv[2], "wb")) == (FILE *)0) fatal("Can't write %s.\n", argv[2]); output_file = argv[2]; outputfile_created = 1; /* FALLTHROUGH */ - case 2: if ((input = fopen(argv[1], "r")) == (FILE *)0) + case 2: if ((input = fopen(argv[1], "rb")) == (FILE *)0) fatal("Can't read %s.\n", argv[1]); break; default:fatal("Usage: %s
.\n", argv[0]); diff --git a/mach/m68020/libem/build.lua b/mach/m68020/libem/build.lua index c0356c61c..2c56f2a37 100644 --- a/mach/m68020/libem/build.lua +++ b/mach/m68020/libem/build.lua @@ -2,8 +2,37 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, srcs = { - "./*.s", -- csb8.s - "./*.c" + "./aar.s", + "./cii.s", + "./cmi.s", + "./cms.s", + "./cmu.s", + "./csa8.s", + "./csa.s", + "./csb8.s", + "./csb.s", + "./cuu.s", + "./cvf.s", + "./dia.s", + "./divrem8.s", + "./dvi8.s", + "./dvu8.s", + "./exg.s", + "./fat.s", + "./fp68881.s", + "./inn.s", + "./lar.s", + "./los.s", + "./mon.s", + "./nop.s", + "./rmi8.s", + "./rmu8.s", + "./sar.s", + "./set.s", + "./shp.s", + "./sts.s", + "./trp.s", + "./trpstr.c", }, vars = { plat = plat }, deps = { diff --git a/mach/m68020/libend/build.lua b/mach/m68020/libend/build.lua index ca5a13c65..bfbf21cd0 100644 --- a/mach/m68020/libend/build.lua +++ b/mach/m68020/libend/build.lua @@ -1,7 +1,12 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./edata.s", + "./em_end.s", + "./end.s", + "./etext.s", + }, vars = { plat = plat }, } end diff --git a/mach/m68020/ncg/build.lua b/mach/m68020/ncg/build.lua new file mode 100644 index 000000000..35af754e4 --- /dev/null +++ b/mach/m68020/ncg/build.lua @@ -0,0 +1,9 @@ +bundle { + name = "headers", + srcs = { + "./mach.c", + "./mach.h", + "./whichone.h" + } +} + diff --git a/mach/m68k2/cv/cv.c b/mach/m68k2/cv/cv.c index 290c6b1de..4989b6102 100644 --- a/mach/m68k2/cv/cv.c +++ b/mach/m68k2/cv/cv.c @@ -102,12 +102,12 @@ main(argc, argv) } switch (argc) { case 1: break; - case 3: if ((output = fopen(argv[2], "w")) == (FILE *)0) + case 3: if ((output = fopen(argv[2], "wb")) == (FILE *)0) fatal("Can't write %s.\n", argv[2]); ofile = argv[2]; ofile_created = 1; /* FALLTHROUGH */ - case 2: if ((input = fopen(argv[1], "r")) == (FILE *)0) + case 2: if ((input = fopen(argv[1], "rb")) == (FILE *)0) fatal("Can't read %s.\n", argv[1]); break; default:fatal("Usage: %s
.\n", argv[0]); diff --git a/mach/m68k2/cv/cv.prev.c b/mach/m68k2/cv/cv.prev.c index 8494ce3fc..8fb222fff 100644 --- a/mach/m68k2/cv/cv.prev.c +++ b/mach/m68k2/cv/cv.prev.c @@ -38,12 +38,12 @@ main(argc, argv) program= argv[0] ; switch (argc) { case 1: break; - case 3: if ((output = fopen(argv[2], "w")) == (FILE *)0) + case 3: if ((output = fopen(argv[2], "wb")) == (FILE *)0) fatal("Can't write %s.\n", argv[2]); output_file = argv[2]; output_file_created = 1; /* FALLTHROUGH */ - case 2: if ((input = fopen(argv[1], "r")) == (FILE *)0) + case 2: if ((input = fopen(argv[1], "rb")) == (FILE *)0) fatal("Can't read %s.\n", argv[1]); break; default:fatal("Usage: %s
.\n", argv[0]); diff --git a/mach/m68k2/dl/cv.c b/mach/m68k2/dl/cv.c index cf2a7f98f..3546b253d 100644 --- a/mach/m68k2/dl/cv.c +++ b/mach/m68k2/dl/cv.c @@ -36,11 +36,11 @@ main(argc,argv) char **argv; { fprintf(stderr,"Usage: %s VU-a.out Bleasdale-a.out\n",argv[0]); exit(-1); } - if (freopen(argv[1],"r",stdin)==NULL) { + if (freopen(argv[1],"rb",stdin)==NULL) { perror(argv[1]); exit(-1); } - if (freopen(argv[2],"w",stdout)==NULL) { + if (freopen(argv[2],"wb",stdout)==NULL) { perror(argv[2]); exit(-1); } diff --git a/mach/mantra/cv/Xcv.c b/mach/mantra/cv/Xcv.c index da3033ead..d8a9f4988 100644 --- a/mach/mantra/cv/Xcv.c +++ b/mach/mantra/cv/Xcv.c @@ -108,7 +108,7 @@ main(argc, argv) case 3: if (! wr_open(argv[2])) fatal("Can't write %s.\n", argv[2]); output_file = argv[2]; - if ((input = fopen(argv[1], "r")) == (FILE *)0) + if ((input = fopen(argv[1], "rb")) == (FILE *)0) fatal("Can't read %s.\n", argv[1]); break; default:fatal("Usage: %s .\n", argv[0]); diff --git a/mach/mantra/cv/cv.c b/mach/mantra/cv/cv.c index f9a2536ba..2dfeb1b89 100644 --- a/mach/mantra/cv/cv.c +++ b/mach/mantra/cv/cv.c @@ -107,7 +107,7 @@ main(argc, argv) argc-- ; argv++ ; } switch (argc) { - case 3: if ((output = fopen(argv[2], "w")) == (FILE *)0) + case 3: if ((output = fopen(argv[2], "wb")) == (FILE *)0) fatal("Can't write %s.\n", argv[2]); output_file = argv[2]; outputfile_created = 1; diff --git a/mach/mips/as/build.lua b/mach/mips/as/build.lua index 8732fdf14..d330957a0 100644 --- a/mach/mips/as/build.lua +++ b/mach/mips/as/build.lua @@ -4,3 +4,16 @@ normalrule { ins = {"./mktables.lua", "./instructions.dat"}, commands = {"$(LUA) %{ins[1]} %{outs} < %{ins[2]}"} } + +bundle { + name = "headers", + srcs = { + "./mach0.c", + "./mach1.c", + "./mach2.c", + "./mach3.c", + "./mach4.c", + "./mach5.c", + } +} + diff --git a/mach/mips/as/mktables.lua b/mach/mips/as/mktables.lua index f1214e248..b6bbf1883 100755 --- a/mach/mips/as/mktables.lua +++ b/mach/mips/as/mktables.lua @@ -139,19 +139,19 @@ while true do end end -local definitionsfp = io.open(args[1], "w") +local definitionsfp = io.open(args[1], "wb") for word, value in pairs(words) do definitionsfp:write("%token OP_", tostring(value), " /* ", word, " */\n") end definitionsfp:close() -local tokensfp = io.open(args[2], "w") +local tokensfp = io.open(args[2], "wb") for word, value in pairs(words) do tokensfp:write("0, OP_", value, ", 0, \"", word, "\",\n") end tokensfp:close() -local rulesfp = io.open(args[3], "w") +local rulesfp = io.open(args[3], "wb") rulesfp:write("operation\n") for index, insn in ipairs(insns) do if index == 1 then diff --git a/mach/mips/libem/build.lua b/mach/mips/libem/build.lua index 5ed9b52e8..9145f6730 100644 --- a/mach/mips/libem/build.lua +++ b/mach/mips/libem/build.lua @@ -6,7 +6,33 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, srcs = { - "./*.s", -- dus4.s + "./aar4.s", + "./and.s", + "./bls4.s", + "./cms.s", + "./compareul.s", + "./com.s", + "./csa.s", + "./csb.s", + "./c_ud_i.s", + "./c_uf_i.s", + "./c_ui_d.s", + "./c_ui_f.s", + "./dus4.s", + "./exg.s", + "./fef8.s", + "./fif8.s", + "./inn.s", + "./ior.s", + "./lar4.s", + "./los4.s", + "./rck.s", + "./sar4.s", + "./set.s", + "./sts4.s", + "./trp.s", + "./xor.s", + "./zer.s", }, vars = { plat = plat }, deps = { diff --git a/mach/mips/libend/build.lua b/mach/mips/libend/build.lua index ca5a13c65..bfbf21cd0 100644 --- a/mach/mips/libend/build.lua +++ b/mach/mips/libend/build.lua @@ -1,7 +1,12 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./edata.s", + "./em_end.s", + "./end.s", + "./etext.s", + }, vars = { plat = plat }, } end diff --git a/mach/mips/mcg/build.lua b/mach/mips/mcg/build.lua new file mode 100644 index 000000000..ed2d2687c --- /dev/null +++ b/mach/mips/mcg/build.lua @@ -0,0 +1,7 @@ +bundle { + name = "headers", + srcs = { + "./platform.c", + } +} + diff --git a/mach/pdp/as/build.lua b/mach/pdp/as/build.lua new file mode 100644 index 000000000..788b76863 --- /dev/null +++ b/mach/pdp/as/build.lua @@ -0,0 +1,12 @@ +bundle { + name = "headers", + srcs = { + "./mach0.c", + "./mach1.c", + "./mach2.c", + "./mach3.c", + "./mach4.c", + "./mach5.c", + } +} + diff --git a/mach/pdp/cv/build.lua b/mach/pdp/cv/build.lua index 5ba9e5efa..58df93b43 100644 --- a/mach/pdp/cv/build.lua +++ b/mach/pdp/cv/build.lua @@ -1,6 +1,6 @@ cprogram { name = "cv", - srcs = { "./*.c" }, + srcs = { "./cv.c" }, deps = { "h+emheaders", "modules/src/object+lib", diff --git a/mach/pdp/cv/cv.c b/mach/pdp/cv/cv.c index e5c5ffd9f..455469a6b 100644 --- a/mach/pdp/cv/cv.c +++ b/mach/pdp/cv/cv.c @@ -86,7 +86,7 @@ main(argc, argv) switch (argc) { case 1: rd_fdopen(0); break; - case 3: if ((output = fopen(argv[2], "w")) == NULL) { + case 3: if ((output = fopen(argv[2], "wb")) == NULL) { fatal("Can't write %s.\n", argv[2]); } output_file = argv[2]; diff --git a/mach/pdp/libem/build.lua b/mach/pdp/libem/build.lua index ca5a13c65..e70ba80ce 100644 --- a/mach/pdp/libem/build.lua +++ b/mach/pdp/libem/build.lua @@ -1,7 +1,79 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./aar.s", + "./adf.s", + "./adi.s", + "./and.s", + "./cff.s", + "./cfi.s", + "./cif.s", + "./cii.s", + "./ciu.s", + "./cmf.s", + "./cmi4.s", + "./cmi.s", + "./cms.s", + "./cmu4.s", + "./cmu.s", + "./csa.s", + "./csb.s", + "./dup.s", + "./dvf.s", + "./dvi4.s", + "./dvi.s", + "./dvu2.s", + "./dvu4.s", + "./dvu.s", + "./eret.s", + "./exg.s", + "./fef.s", + "./fif.s", + "./gto.s", + "./iaar.s", + "./ilar.s", + "./inn.s", + "./isar.s", + "./lar.s", + "./los2.s", + "./mlf.s", + "./mli4.s", + "./mli.s", + "./mlu4.s", + "./mlu.s", + "./mon.s", + "./ngf.s", + "./ngi.s", + "./nop.s", + "./prf.s", + "./printf.s", + "./rck.s", + "./ret.s", + "./rmi4.s", + "./rmi.s", + "./rmu2.s", + "./rmu4.s", + "./rmu.s", + "./rol.s", + "./ror.s", + "./RT.s", + "./sar.s", + "./save.s", + "./sbf.s", + "./sbi.s", + "./setfl.s", + "./set.s", + "./sim.s", + "./sli.s", + "./sri.s", + "./sru.s", + "./sto2.s", + "./strhp.s", + "./trp.s", + "./unknown.s", + "./xor.s", + }, vars = { plat = plat }, } end diff --git a/mach/pdp/libend/build.lua b/mach/pdp/libend/build.lua index ca5a13c65..bfbf21cd0 100644 --- a/mach/pdp/libend/build.lua +++ b/mach/pdp/libend/build.lua @@ -1,7 +1,12 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./edata.s", + "./em_end.s", + "./end.s", + "./etext.s", + }, vars = { plat = plat }, } end diff --git a/mach/pmds/cv/cv.c b/mach/pmds/cv/cv.c index bc1fecb2f..4d6c9cec6 100644 --- a/mach/pmds/cv/cv.c +++ b/mach/pmds/cv/cv.c @@ -88,7 +88,7 @@ main(argc, argv) argc-- ; argv++ ; } switch (argc) { - case 3: if ((output = fopen(argv[2], "w")) == (FILE *)0) + case 3: if ((output = fopen(argv[2], "wb")) == (FILE *)0) fatal("Can't write %s.\n", argv[2]); output_file = argv[2]; outputfile_created = 1; diff --git a/mach/powerpc/as/build.lua b/mach/powerpc/as/build.lua new file mode 100644 index 000000000..788b76863 --- /dev/null +++ b/mach/powerpc/as/build.lua @@ -0,0 +1,12 @@ +bundle { + name = "headers", + srcs = { + "./mach0.c", + "./mach1.c", + "./mach2.c", + "./mach3.c", + "./mach4.c", + "./mach5.c", + } +} + diff --git a/mach/powerpc/libem/build.lua b/mach/powerpc/libem/build.lua index 5ed9b52e8..832f3cf59 100644 --- a/mach/powerpc/libem/build.lua +++ b/mach/powerpc/libem/build.lua @@ -6,7 +6,35 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, srcs = { - "./*.s", -- dus4.s + "./aar4.s", + "./and.s", + "./bls4.s", + "./cfi8.s", + "./cfu8.s", + "./cif8.s", + "./cms.s", + "./com.s", + "./csa.s", + "./csb.s", + "./cuf8.s", + -- "./dus4.s", + "./exg.s", + "./fd_00000000.s", + "./fef4.s", + "./fef8.s", + "./fif4.s", + "./fif8.s", + "./inn.s", + "./ior.s", + "./lar4.s", + "./los4.s", + "./rck.s", + "./sar4.s", + "./set.s", + "./sts4.s", + "./trp.s", + "./xor.s", + "./zer.s", }, vars = { plat = plat }, deps = { diff --git a/mach/powerpc/libend/build.lua b/mach/powerpc/libend/build.lua index ca5a13c65..bfbf21cd0 100644 --- a/mach/powerpc/libend/build.lua +++ b/mach/powerpc/libend/build.lua @@ -1,7 +1,12 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./edata.s", + "./em_end.s", + "./end.s", + "./etext.s", + }, vars = { plat = plat }, } end diff --git a/mach/powerpc/mcg/build.lua b/mach/powerpc/mcg/build.lua new file mode 100644 index 000000000..ed2d2687c --- /dev/null +++ b/mach/powerpc/mcg/build.lua @@ -0,0 +1,7 @@ +bundle { + name = "headers", + srcs = { + "./platform.c", + } +} + diff --git a/mach/powerpc/ncg/build.lua b/mach/powerpc/ncg/build.lua new file mode 100644 index 000000000..cc47f9b7b --- /dev/null +++ b/mach/powerpc/ncg/build.lua @@ -0,0 +1,8 @@ +bundle { + name = "headers", + srcs = { + "./mach.c", + "./mach.h" + } +} + diff --git a/mach/proto/as/build.lua b/mach/proto/as/build.lua index d9718e06f..9a2fa67a9 100644 --- a/mach/proto/as/build.lua +++ b/mach/proto/as/build.lua @@ -1,4 +1,4 @@ -include("first/yacc.lua") +include("first/bison.lua") definerule("build_as", { @@ -11,14 +11,11 @@ definerule("build_as", local archlib = clibrary { name = e.name.."/archlib", srcs = {}, - hdrs = { - "mach/"..e.arch.."/as/mach*.c", - "mach/"..e.arch.."/as/*.h" - } + hdrs = { "mach/"..e.arch.."/as+headers" }, } local preprocessedy = cppfile { - name = e.name.."/yaccinput", + name = e.name.."/bisoninput", srcs = { "mach/proto/as/comm2.y" }, outleaf = "comm2.y", deps = { @@ -30,23 +27,28 @@ definerule("build_as", }, } - local yaccfiles = yacc { - name = e.name.."/yacc", + local bisonfiles = bison { + name = e.name.."/bison", srcs = { preprocessedy } } return cprogram { name = e.name, srcs = concat( - "mach/proto/as/*.c", - matching(filenamesof(yaccfiles), "%.c$") + "mach/proto/as/comm3.c", + "mach/proto/as/comm4.c", + "mach/proto/as/comm5.c", + "mach/proto/as/comm6.c", + "mach/proto/as/comm7.c", + "mach/proto/as/comm8.c", + matching(filenamesof(bisonfiles), "%.c$") ), deps = { "h+emheaders", "modules/src/object+lib", "modules/src/flt_arith+lib", archlib, - yaccfiles, + bisonfiles, e.deps } } diff --git a/mach/proto/as/comm4.c b/mach/proto/as/comm4.c index 4abf13dbb..756f2d4c0 100644 --- a/mach/proto/as/comm4.c +++ b/mach/proto/as/comm4.c @@ -44,9 +44,6 @@ main(int argc, char **argv) { char *p; int i; - static char sigs[] = { - SIGHUP, SIGINT, SIGQUIT, SIGTERM, 0 - }; /* the next test should be performed by the * preprocessor, but it cannot, so it is performed by the compiler. @@ -58,9 +55,8 @@ main(int argc, char **argv) } progname = *argv++; argc--; - for (p = sigs; (i = *p++) != 0; ) - if (signal(i, SIG_IGN) != SIG_IGN) - signal(i, stop_on_signal); + if (signal(SIGINT, SIG_IGN) != SIG_IGN) + signal(SIGINT, stop_on_signal); for (i = 0; i < argc; i++) { p = argv[i]; if (*p++ != '-') @@ -169,7 +165,7 @@ pass_1(int argc, char **argv) continue; } #endif - if ((input = fopen(p, "r")) == NULL) + if ((input = fopen(p, "rb")) == NULL) fatal("can't open %s", p); #ifdef ASLD if ( diff --git a/mach/proto/cg/build.lua b/mach/proto/cg/build.lua index a754ebb4f..d9b0fb240 100644 --- a/mach/proto/cg/build.lua +++ b/mach/proto/cg/build.lua @@ -11,9 +11,24 @@ definerule("build_cg", name = e.name.."/headers", srcs = {}, hdrs = { - "mach/proto/cg/*.h", + "mach/proto/cg/assert.h", + "mach/proto/cg/codegen.h", + "mach/proto/cg/data.h", + "mach/proto/cg/equiv.h", + "mach/proto/cg/extern.h", + "mach/proto/cg/fillem.h", + "mach/proto/cg/gencode.h", + "mach/proto/cg/glosym.h", + "mach/proto/cg/param.h", + "mach/proto/cg/reg.h", + "mach/proto/cg/regvar.h", + "mach/proto/cg/result.h", + "mach/proto/cg/salloc.h", + "mach/proto/cg/state.h", + "mach/proto/cg/subr.h", + "mach/proto/cg/types.h", "mach/"..e.arch.."/cg/mach.c", - "mach/"..e.arch.."/cg/*.h", + "mach/"..e.arch.."/cg/mach.h", } } @@ -25,7 +40,21 @@ definerule("build_cg", return cprogram { name = e.name, srcs = { - "mach/proto/cg/*.c", + "mach/proto/cg/codegen.c", + "mach/proto/cg/compute.c", + "mach/proto/cg/equiv.c", + "mach/proto/cg/fillem.c", + "mach/proto/cg/gencode.c", + "mach/proto/cg/glosym.c", + "mach/proto/cg/main.c", + "mach/proto/cg/move.c", + "mach/proto/cg/nextem.c", + "mach/proto/cg/reg.c", + "mach/proto/cg/regvar.c", + "mach/proto/cg/salloc.c", + "mach/proto/cg/state.c", + "mach/proto/cg/subr.c", + "mach/proto/cg/var.c", matching(filenamesof(tables), "%.c$") }, deps = { diff --git a/mach/proto/cg/fillem.c b/mach/proto/cg/fillem.c index f33520e8b..4547b212d 100644 --- a/mach/proto/cg/fillem.c +++ b/mach/proto/cg/fillem.c @@ -141,7 +141,7 @@ static long our_atol(register char *s) void in_init(char *filename) { - if ((emfile=freopen(filename,"r",stdin))==NULL) + if ((emfile=freopen(filename,"rb",stdin))==NULL) error("Can't open %s",filename); if (get16()!=sp_magic) error("Bad format %s",filename); diff --git a/mach/proto/cg/gencode.c b/mach/proto/cg/gencode.c index 7582808ab..47ba70293 100644 --- a/mach/proto/cg/gencode.c +++ b/mach/proto/cg/gencode.c @@ -34,7 +34,7 @@ void out_init(char *filename) #endif if (filename == (char *) 0) codefile = stdout; - else if ((codefile = freopen(filename, "w", stdout)) == NULL) + else if ((codefile = freopen(filename, "wb", stdout)) == NULL) error("Can't create %s", filename); #ifndef NDEBUG } diff --git a/mach/proto/fp/FP.script b/mach/proto/fp/FP.script deleted file mode 100644 index a8f12982a..000000000 --- a/mach/proto/fp/FP.script +++ /dev/null @@ -1,40 +0,0 @@ -g/_adf4/s//.adf4/g -g/_adf8/s//.adf8/g -g/_cff4/s//.cff4/g -g/_cff8/s//.cff8/g -g/_cfi/s//.cfi/g -g/_cfu/s//.cfu/g -g/_cif4/s//.cif4/g -g/_cif8/s//.cif8/g -g/_cmf4/s//.cmf4/g -g/_cmf8/s//.cmf8/g -g/_cuf4/s//.cuf4/g -g/_cuf8/s//.cuf8/g -g/_dvf4/s//.dvf4/g -g/_dvf8/s//.dvf8/g -g/_fef4/s//.fef4/g -g/_fef8/s//.fef8/g -g/_fif4/s//.fif4/g -g/_fif8/s//.fif8/g -g/_mlf4/s//.mlf4/g -g/_mlf8/s//.mlf8/g -g/_ngf4/s//.ngf4/g -g/_ngf8/s//.ngf8/g -g/_sbf4/s//.sbf4/g -g/_sbf8/s//.sbf8/g -g/_zrf4/s//.zrf4/g -g/_zrf8/s//.zrf8/g -g/_add_ext/s//.add_ext/g -g/_div_ext/s//.div_ext/g -g/_mul_ext/s//.mul_ext/g -g/_nrm_ext/s//.nrm_ext/g -g/_sft_ext/s//.sft_ext/g -g/_sub_ext/s//.sub_ext/g -g/_zrf_ext/s//.zrf_ext/g -g/_compact/s//.compact/g -g/_extend/s//.extend/g -g/_b64_add/s//.b64_add/g -g/_b64_sft/s//.b64_sft/g -g/_b64_rsft/s//.b64_rsft/g -g/_b64_lsft/s//.b64_lsft/g -1,$p diff --git a/mach/proto/fp/build.lua b/mach/proto/fp/build.lua index 3dd62d56d..8ea46b5be 100644 --- a/mach/proto/fp/build.lua +++ b/mach/proto/fp/build.lua @@ -3,10 +3,51 @@ include("plat/build.lua") -- For now, all floats are little-endian. local byte_order = "mach/i86/libfp/byte_order.h" +local srcs = { + "./adder.c", + "./add_ext.c", + "./adf4.c", + "./adf8.c", + "./cff4.c", + "./cff8.c", + "./cfi.c", + "./cfu.c", + "./cif4.c", + "./cif8.c", + "./cmf4.c", + "./cmf8.c", + "./compact.c", + "./cuf4.c", + "./cuf8.c", + "./div_ext.c", + "./dvf4.c", + "./dvf8.c", + "./extend.c", + "./fef4.c", + "./fef8.c", + "./fif4.c", + "./fif8.c", + "./fptrp.e", + "./mlf4.c", + "./mlf8.c", + "./mul_ext.c", + "./ngf4.c", + "./ngf8.c", + "./nrm_ext.c", + "./sbf4.c", + "./sbf8.c", + "./sft_ext.c", + "./shifter.c", + "./sub_ext.c", + "./zrf4.c", + "./zrf8.c", + "./zrf_ext.c", +} + -- For now, only cpm uses software floating-point. for _, plat in ipairs({"cpm"}) do local edits = {} - for _, src in fpairs("./*.c", "./*.e") do + for _, src in fpairs(srcs) do -- Compile each src file into assembly code. local n = basename(src):gsub("%.%w*$", "") @@ -14,7 +55,11 @@ for _, plat in ipairs({"cpm"}) do name = "s_"..plat.."/"..n, srcs = { src }, deps = { - "./*.h", + "./FP_bias.h", + "./FP_shift.h", + "./FP_trap.h", + "./FP_types.h", + "./get_put.h", byte_order, }, suffix = ".s", @@ -24,17 +69,16 @@ for _, plat in ipairs({"cpm"}) do } } - -- Run FP.script to edit the assembly code. + -- Run massage_s.lua to edit the assembly code. edits[#edits+1] = normalrule { name = "ed_"..plat.."/"..n, ins = { - "./FP.script", - "util/cmisc+ed", + "./massage_s.lua", assembly, }, outleaves = { n..".s" }, commands = { - "%{ins[2]} -s %{ins[3]} <%{ins[1]} >%{outs}" + "$LUA %{ins[1]} <%{ins[2]} >%{outs}" } } end diff --git a/mach/proto/fp/massage_s.lua b/mach/proto/fp/massage_s.lua new file mode 100644 index 000000000..1dd8d19c4 --- /dev/null +++ b/mach/proto/fp/massage_s.lua @@ -0,0 +1,47 @@ +local syms = { + "_adf4", + "_adf8", + "_cff4", + "_cff8", + "_cfi", + "_cfu", + "_cif4", + "_cif8", + "_cmf4", + "_cmf8", + "_cuf4", + "_cuf8", + "_dvf4", + "_dvf8", + "_fef4", + "_fef8", + "_fif4", + "_fif8", + "_mlf4", + "_mlf8", + "_ngf4", + "_ngf8", + "_sbf4", + "_sbf8", + "_zrf4", + "_zrf8", + "_add_ext", + "_div_ext", + "_mul_ext", + "_nrm_ext", + "_sft_ext", + "_sub_ext", + "_zrf_ext", + "_compact", + "_extend", + "_b64_add", + "_b64_sft", + "_b64_rsft", + "_b64_lsft", +} + +local data = io.stdin:read("*a") +for _, s in ipairs(syms) do + data = data:gsub(s, (s:gsub("^_", "."))) +end +io.stdout:write(data) diff --git a/mach/proto/mcg/build.lua b/mach/proto/mcg/build.lua index 67c0645b5..b8a244034 100644 --- a/mach/proto/mcg/build.lua +++ b/mach/proto/mcg/build.lua @@ -11,8 +11,16 @@ definerule("build_mcg", name = e.name.."/headers", srcs = {}, hdrs = { - "mach/proto/mcg/*.h", - "mach/"..e.arch.."/mcg/*.h", + "mach/proto/mcg/basicblock.h", + "mach/proto/mcg/graph.h", + "mach/proto/mcg/hop.h", + "mach/proto/mcg/ir.h", + "mach/proto/mcg/mcgg_generated_footer.h", + "mach/proto/mcg/mcgg_generated_header.h", + "mach/proto/mcg/mcg.h", + "mach/proto/mcg/procedure.h", + "mach/proto/mcg/reg.h", + "mach/"..e.arch.."/mcg+headers", } } @@ -24,7 +32,33 @@ definerule("build_mcg", return cprogram { name = e.name, srcs = { - "mach/proto/mcg/*.c", + "mach/proto/mcg/basicblock.c", + "mach/proto/mcg/data.c", + "mach/proto/mcg/graph.c", + "mach/proto/mcg/hop.c", + "mach/proto/mcg/ir.c", + "mach/proto/mcg/main.c", + "mach/proto/mcg/parse_em.c", + "mach/proto/mcg/pass_convertstackops.c", + "mach/proto/mcg/pass_eliminatetrivialblocks.c", + "mach/proto/mcg/pass_groupirs.c", + "mach/proto/mcg/pass_instructionselection.c", + "mach/proto/mcg/pass_livevreganalysis.c", + "mach/proto/mcg/pass_lowerpushes.c", + "mach/proto/mcg/pass_phigroups.c", + "mach/proto/mcg/pass_prologueepilogue.c", + "mach/proto/mcg/pass_registerallocator.c", + "mach/proto/mcg/pass_removedeadblocks.c", + "mach/proto/mcg/pass_removedeadphis.c", + "mach/proto/mcg/pass_returnvalues.c", + "mach/proto/mcg/pass_splitcriticaledges.c", + "mach/proto/mcg/pass_ssa.c", + "mach/proto/mcg/pass_typeinference.c", + "mach/proto/mcg/predicates.c", + "mach/proto/mcg/procedure.c", + "mach/proto/mcg/reg.c", + "mach/proto/mcg/symbol.c", + "mach/proto/mcg/treebuilder.c", "mach/"..e.arch.."/mcg/platform.c", matching(filenamesof(tables), "%.c$") }, diff --git a/mach/proto/mcg/data.c b/mach/proto/mcg/data.c index 95d828650..dfd3651d4 100644 --- a/mach/proto/mcg/data.c +++ b/mach/proto/mcg/data.c @@ -76,7 +76,7 @@ void data_float(const char* data, size_t size, bool is_ro) fprintf(outputfile, "\t.dataf%ld %s\n", size, data); } -static bool istext(c) +static bool istext(char c) { return isprint(c) && (c != '"'); } diff --git a/mach/proto/mcg/main.c b/mach/proto/mcg/main.c index aa0fa4816..4fbd78173 100644 --- a/mach/proto/mcg/main.c +++ b/mach/proto/mcg/main.c @@ -15,7 +15,7 @@ bool tracing(char k) if (!tracechars) return false; - return index(tracechars, k); + return strchr(tracechars, k); } void tracef(char k, const char* fmt, ...) @@ -56,7 +56,7 @@ int main(int argc, char* const argv[]) switch (c) { case 'C': - cfg_dot_file = fopen(optarg, "w"); + cfg_dot_file = fopen(optarg, "wb"); if (!cfg_dot_file) fatal("couldn't open output file '%s': %s", optarg, strerror(errno)); @@ -64,7 +64,7 @@ int main(int argc, char* const argv[]) break; case 'D': - dominance_dot_file = fopen(optarg, "w"); + dominance_dot_file = fopen(optarg, "wb"); if (!dominance_dot_file) fatal("couldn't open output file '%s': %s", optarg, strerror(errno)); @@ -98,7 +98,7 @@ int main(int argc, char* const argv[]) if (outputfilename) { - outputfile = fopen(outputfilename, "w"); + outputfile = fopen(outputfilename, "wb"); if (!outputfile) fatal("couldn't open output '%s': %s", outputfilename, strerror(errno)); diff --git a/mach/proto/mcg/mcg.h b/mach/proto/mcg/mcg.h index 0bd9928df..69f194e85 100644 --- a/mach/proto/mcg/mcg.h +++ b/mach/proto/mcg/mcg.h @@ -9,6 +9,7 @@ #include #include #include +#include "system.h" #include "em_arith.h" #include "em_label.h" #include "em.h" @@ -78,7 +79,6 @@ struct em } u; }; -extern const char* aprintf(const char* fmt, ...); extern void tracef(char k, const char* fmt, ...); extern bool tracing(char k); diff --git a/mach/proto/ncg/build.lua b/mach/proto/ncg/build.lua index 6ab573a8a..f8d42ba56 100644 --- a/mach/proto/ncg/build.lua +++ b/mach/proto/ncg/build.lua @@ -2,7 +2,7 @@ include("util/ncgg/build.lua") definerule("build_ncg", { - arch = { type="string" } + arch = { type="string" }, }, function(e) -- Remember this is executed from the caller's directory; local @@ -21,8 +21,7 @@ definerule("build_ncg", "mach/proto/ncg/state.h", "mach/proto/ncg/types.h", "mach/proto/ncg/xmach.h", - "mach/"..e.arch.."/ncg/mach.c", - "mach/"..e.arch.."/ncg/*.h", + "mach/"..e.arch.."/ncg+headers", } } @@ -34,7 +33,22 @@ definerule("build_ncg", return cprogram { name = e.name, srcs = { - "mach/proto/ncg/*.c", + "mach/proto/ncg/codegen.c", + "mach/proto/ncg/compute.c", + "mach/proto/ncg/equiv.c", + "mach/proto/ncg/fillem.c", + "mach/proto/ncg/gencode.c", + "mach/proto/ncg/glosym.c", + "mach/proto/ncg/label.c", + "mach/proto/ncg/main.c", + "mach/proto/ncg/move.c", + "mach/proto/ncg/nextem.c", + "mach/proto/ncg/reg.c", + "mach/proto/ncg/regvar.c", + "mach/proto/ncg/salloc.c", + "mach/proto/ncg/state.c", + "mach/proto/ncg/subr.c", + "mach/proto/ncg/var.c", matching(filenamesof(tables), "%.c$") }, deps = { diff --git a/mach/proto/ncg/fillem.c b/mach/proto/ncg/fillem.c index c83144b1a..2aa6798d2 100644 --- a/mach/proto/ncg/fillem.c +++ b/mach/proto/ncg/fillem.c @@ -140,7 +140,7 @@ static long our_atol(char *s) { void in_init(char *filename) { emfile = stdin; - if (filename && (emfile=freopen(filename,"r",stdin))==NULL) + if (filename && (emfile=freopen(filename,"rb",stdin))==NULL) error("Can't open %s",filename); if (get16()!=sp_magic) error("Bad format %s",filename ? filename : "standard-input"); diff --git a/mach/proto/ncg/gencode.c b/mach/proto/ncg/gencode.c index 8b097f9ec..a0550fde1 100644 --- a/mach/proto/ncg/gencode.c +++ b/mach/proto/ncg/gencode.c @@ -39,7 +39,7 @@ void out_init(char *filename) { if (filename == (char *) 0) codefile = stdout; else - if ((codefile=freopen(filename,"w",stdout))==NULL) + if ((codefile=freopen(filename,"wb",stdout))==NULL) error("Can't create %s",filename); #ifndef NDEBUG } diff --git a/mach/proto/top/build.lua b/mach/proto/top/build.lua index 56ee652b9..525083d34 100644 --- a/mach/proto/top/build.lua +++ b/mach/proto/top/build.lua @@ -12,7 +12,10 @@ definerule("build_top", return cprogram { name = e.name, - srcs = { "mach/proto/top/*.c", }, + srcs = { + "mach/proto/top/queue.c", + "mach/proto/top/top.c", + }, deps = { t }, } end diff --git a/mach/sparc/ce/back.src/do_open.c b/mach/sparc/ce/back.src/do_open.c index 3887e0d9e..f50e4a4ab 100644 --- a/mach/sparc/ce/back.src/do_open.c +++ b/mach/sparc/ce/back.src/do_open.c @@ -13,7 +13,7 @@ char *filename; #ifndef sys_close if ( sys_open( filename, OP_WRITE, &codefile)) { #else - if ((codefile = fopen(filename, "w")) != NULL) { + if ((codefile = fopen(filename, "wb")) != NULL) { #endif #ifdef __solaris__ fprint(codefile, ".section \".text\"\n"); diff --git a/mach/sun3/cv/Xcv.c b/mach/sun3/cv/Xcv.c index 68c287086..696155959 100644 --- a/mach/sun3/cv/Xcv.c +++ b/mach/sun3/cv/Xcv.c @@ -60,7 +60,7 @@ main(argc, argv) case 3: if (! wr_open(argv[2])) fatal("Can't write %s.\n", argv[2]); output_file = argv[2]; - if ((input = fopen(argv[1], "r")) == (FILE *)0) + if ((input = fopen(argv[1], "rb")) == (FILE *)0) fatal("Can't read %s.\n", argv[1]); break; default:fatal("Usage: %s .\n", argv[0]); diff --git a/mach/vc4/as/build.lua b/mach/vc4/as/build.lua new file mode 100644 index 000000000..2c2d45031 --- /dev/null +++ b/mach/vc4/as/build.lua @@ -0,0 +1,13 @@ +bundle { + name = "headers", + srcs = { + "./mach0.c", + "./mach1.c", + "./mach2.c", + "./mach3.c", + "./mach4.c", + "./mach5.c", + "./binary.h", + } +} + diff --git a/mach/vc4/libem/build.lua b/mach/vc4/libem/build.lua index ca5a13c65..61cd461b2 100644 --- a/mach/vc4/libem/build.lua +++ b/mach/vc4/libem/build.lua @@ -1,7 +1,10 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./csa.s", + "./csb.s", + }, vars = { plat = plat }, } end diff --git a/mach/vc4/libend/build.lua b/mach/vc4/libend/build.lua index ca5a13c65..bfbf21cd0 100644 --- a/mach/vc4/libend/build.lua +++ b/mach/vc4/libend/build.lua @@ -1,7 +1,12 @@ for _, plat in ipairs(vars.plats) do acklibrary { name = "lib_"..plat, - srcs = { "./*.s" }, + srcs = { + "./edata.s", + "./em_end.s", + "./end.s", + "./etext.s", + }, vars = { plat = plat }, } end diff --git a/mach/vc4/ncg/build.lua b/mach/vc4/ncg/build.lua new file mode 100644 index 000000000..cc47f9b7b --- /dev/null +++ b/mach/vc4/ncg/build.lua @@ -0,0 +1,8 @@ +bundle { + name = "headers", + srcs = { + "./mach.c", + "./mach.h" + } +} + diff --git a/mach/z80/int/dl.c b/mach/z80/int/dl.c index f37714ff6..8d79832b3 100644 --- a/mach/z80/int/dl.c +++ b/mach/z80/int/dl.c @@ -39,7 +39,7 @@ main(argc,argv) char **argv; { s = "a.out"; if (argc >= 2) s = argv[1]; - if (freopen(s,"r",stdin) == NULL) + if (freopen(s,"rb",stdin) == NULL) fatal("can't open %s",s); s = "/dev/tty05"; if (argc >= 3) @@ -54,7 +54,7 @@ main(argc,argv) char **argv; { tty.sg_flags = RAW; stty(ttyfd,&tty); } else { - freopen(s,"w",stdout); + freopen(s,"wb",stdout); } first = 1; osg = 0; /* uid = getuid(); */ diff --git a/modules/build.lua b/modules/build.lua index a2228f2a8..2838eb7c8 100644 --- a/modules/build.lua +++ b/modules/build.lua @@ -1,7 +1,12 @@ clibrary { name = "headers", hdrs = { - "./h/*.h" + "./h/ansi.h", + "./h/em_arith.h", + "./h/em.h", + "./h/em_label.h", + "./h/em_mesX.h", + "./h/emO_code.h", } } diff --git a/modules/src/alloc/Amake.srclist b/modules/src/alloc/Amake.srclist index 829f2183b..377a0a5ba 100644 --- a/modules/src/alloc/Amake.srclist +++ b/modules/src/alloc/Amake.srclist @@ -1,13 +1,13 @@ -L_ACK_MODULES_ALLOC = { - $PWD/Malloc.c, - $PWD/Salloc.c, - $PWD/Srealloc.c, - $PWD/Realloc.c, - $PWD/botch.c, - $PWD/clear.c, - $PWD/st_alloc.c, - $PWD/std_alloc.c, - $PWD/No_Mem.c, - $PWD/alloc.h -}; - +L_ACK_MODULES_ALLOC = { + $PWD/Malloc.c, + $PWD/Salloc.c, + $PWD/Srealloc.c, + $PWD/Realloc.c, + $PWD/botch.c, + $PWD/clear.c, + $PWD/st_alloc.c, + $PWD/std_alloc.c, + $PWD/No_Mem.c, + $PWD/alloc.h +}; + diff --git a/modules/src/alloc/alloc.3 b/modules/src/alloc/alloc.3 index 5db5745d8..8cc7c32df 100644 --- a/modules/src/alloc/alloc.3 +++ b/modules/src/alloc/alloc.3 @@ -1,80 +1,80 @@ -.TH ALLOC 3 "$Revision$" -.ad -.SH NAME -Malloc, Salloc, Realloc, Srealloc, st_alloc, st_free\ \-\ low level memory allocation routines -.SH SYNOPSIS -.B #include -.PP -.B char *Malloc(unsigned int size) -.PP -.B char *Salloc(char *str, unsigned int size) -.PP -.B char *Realloc(char *buf, unsigned int size) -.PP -.B char *Srealloc(char *str, unsigned int size) -.PP -.B char *st_alloc(char **phead, unsigned int size, int count) -.PP -.B st_free(char *ptr, char **phead, unsigned int size) -.PP -.B void clear(char *ptr, unsigned int size) -.PP -.void No_Mem() -.PP -.SH DESCRIPTION -This set of routines provides a checking memory allocation mechanism. -.PP -\fIMalloc\fR returns a pointer to a block of at least \fIsize\fR -bytes, beginning on a boundary suitable for any data type. -.PP -\fISalloc\fR returns a pointer to a block of at least \fIsize\fR -bytes, initialized with the null-terminated string \fIstr\fR. -.PP -\fIRealloc\fR changes the size of -the block at \fIbuf\fR to \fIsize\fR bytes, and returns a pointer to the -(possibly moved) block. If \fIbuf\fP is a null pointer, \fIRealloc\fP -behaves as \fIMalloc\fP. -.PP -\fISrealloc\fR reallocates -the string at \fIstr\fR to \fIsize\fR bytes. -It actually does the same as \fIRealloc\fP, and exists only for -backwards compatibility. -.PP -All these routines use \fImalloc\fR and \fIrealloc\fR. -The routine \fIfree\fR can be used on pointers returned by these routines. -.PP -\fISt_alloc\fR and \fIst_free\fR provide a mechanism for maintaining free lists -of structures. -\fISt_alloc\fR takes three parameters: \fIphead\fR is a pointer to a field -containing the head of the free list, \fIsize\fR contains the size of the -structures, and \fIcount\fR indicates how many new structures must be allocated -in case the free list is exhausted. -It returns a pointer to a zero-initialized structure. -\fISt_free\fR also takes three parameters: \fIptr\fR is a pointer to -the structure to be freed, \fIphead\fR is again a pointer to a field -containing the head of the free list, and \fIsize\fR again contains the size -of the structures. -These last two routines are best used in a macro. -.PP -\fIclear\fR clears \fIsize\fR bytes, starting at \fIptr\fR. -.SH FILES -.nf -~em/modules/h/alloc.h -~em/modules/lib/liballoc.a -.fi -.SH "SEE ALSO" -malloc(3) -.SH DIAGNOSTICS -\fIMalloc\fR, \fISalloc\fR, \fIRealloc\fP, \fISrealloc\fR, and \fIst_alloc\fR -call a routine \fINo_Mem\fR if there is no memory available. This routine -is not supposed to return. A default one, that -gives an error message and stops execution, is provided. -.SH BUGS -The -.I st_alloc -mechanism only works for structures that are large enough to contain one -pointer. -Also, -.I st_free -actually is a macro, and references its arguments more than once, so they -better not have side-effects. +.TH ALLOC 3 "$Revision$" +.ad +.SH NAME +Malloc, Salloc, Realloc, Srealloc, st_alloc, st_free\ \-\ low level memory allocation routines +.SH SYNOPSIS +.B #include +.PP +.B char *Malloc(unsigned int size) +.PP +.B char *Salloc(char *str, unsigned int size) +.PP +.B char *Realloc(char *buf, unsigned int size) +.PP +.B char *Srealloc(char *str, unsigned int size) +.PP +.B char *st_alloc(char **phead, unsigned int size, int count) +.PP +.B st_free(char *ptr, char **phead, unsigned int size) +.PP +.B void clear(char *ptr, unsigned int size) +.PP +.void No_Mem() +.PP +.SH DESCRIPTION +This set of routines provides a checking memory allocation mechanism. +.PP +\fIMalloc\fR returns a pointer to a block of at least \fIsize\fR +bytes, beginning on a boundary suitable for any data type. +.PP +\fISalloc\fR returns a pointer to a block of at least \fIsize\fR +bytes, initialized with the null-terminated string \fIstr\fR. +.PP +\fIRealloc\fR changes the size of +the block at \fIbuf\fR to \fIsize\fR bytes, and returns a pointer to the +(possibly moved) block. If \fIbuf\fP is a null pointer, \fIRealloc\fP +behaves as \fIMalloc\fP. +.PP +\fISrealloc\fR reallocates +the string at \fIstr\fR to \fIsize\fR bytes. +It actually does the same as \fIRealloc\fP, and exists only for +backwards compatibility. +.PP +All these routines use \fImalloc\fR and \fIrealloc\fR. +The routine \fIfree\fR can be used on pointers returned by these routines. +.PP +\fISt_alloc\fR and \fIst_free\fR provide a mechanism for maintaining free lists +of structures. +\fISt_alloc\fR takes three parameters: \fIphead\fR is a pointer to a field +containing the head of the free list, \fIsize\fR contains the size of the +structures, and \fIcount\fR indicates how many new structures must be allocated +in case the free list is exhausted. +It returns a pointer to a zero-initialized structure. +\fISt_free\fR also takes three parameters: \fIptr\fR is a pointer to +the structure to be freed, \fIphead\fR is again a pointer to a field +containing the head of the free list, and \fIsize\fR again contains the size +of the structures. +These last two routines are best used in a macro. +.PP +\fIclear\fR clears \fIsize\fR bytes, starting at \fIptr\fR. +.SH FILES +.nf +~em/modules/h/alloc.h +~em/modules/lib/liballoc.a +.fi +.SH "SEE ALSO" +malloc(3) +.SH DIAGNOSTICS +\fIMalloc\fR, \fISalloc\fR, \fIRealloc\fP, \fISrealloc\fR, and \fIst_alloc\fR +call a routine \fINo_Mem\fR if there is no memory available. This routine +is not supposed to return. A default one, that +gives an error message and stops execution, is provided. +.SH BUGS +The +.I st_alloc +mechanism only works for structures that are large enough to contain one +pointer. +Also, +.I st_free +actually is a macro, and references its arguments more than once, so they +better not have side-effects. diff --git a/modules/src/alloc/build.lua b/modules/src/alloc/build.lua index c8124c318..001234579 100644 --- a/modules/src/alloc/build.lua +++ b/modules/src/alloc/build.lua @@ -1,11 +1,21 @@ clibrary { name = "lib", - srcs = { "./*.c" }, + srcs = { + "./botch.c", + "./clear.c", + "./Malloc.c", + "./No_Mem.c", + "./Realloc.c", + "./Salloc.c", + "./Srealloc.c", + "./st_alloc.c", + "./std_alloc.c", + }, hdrs = { "./alloc.h" }, deps = { "modules+headers", "modules/src/system+lib", - "./*.h" + "./alloc.h" }, } diff --git a/modules/src/data/astring.c b/modules/src/data/astring.c index 7da06e9fa..097d9f4ad 100644 --- a/modules/src/data/astring.c +++ b/modules/src/data/astring.c @@ -2,7 +2,7 @@ #include #include -const char* aprintf(const char* fmt, ...) +char* aprintf(const char* fmt, ...) { int n; char* p; diff --git a/modules/src/data/astring.h b/modules/src/data/astring.h index 483c0287d..d1fffa807 100644 --- a/modules/src/data/astring.h +++ b/modules/src/data/astring.h @@ -1,7 +1,7 @@ #ifndef ASTRING_H #define ASTRING_H -extern const char* aprintf(const char* fmt, ...); +extern char* aprintf(const char* fmt, ...); #endif diff --git a/modules/src/data/build.lua b/modules/src/data/build.lua index 9f5941808..331ff9a81 100644 --- a/modules/src/data/build.lua +++ b/modules/src/data/build.lua @@ -1,7 +1,25 @@ -clibrary { - name = "lib", - srcs = { "./*.c" }, - hdrs = { "./*.h" }, - deps = { "./*.h" }, +local hfiles = { + "./array.h", + "./astring.h", + "./diagnostics.h", + "./imap.h", + "./pmap.h", + "./smap.h", + "./stringlist.h", +} + +clibrary { + name = "lib", + srcs = { + "./array.c", + "./astring.c", + "./diagnostics.c", + "./imap.c", + "./pmap.c", + "./smap.c", + "./stringlist.c", + }, + hdrs = hfiles, + deps = hfiles, } diff --git a/modules/src/em_code/build.lua b/modules/src/em_code/build.lua index b65ce83ca..37392d425 100644 --- a/modules/src/em_code/build.lua +++ b/modules/src/em_code/build.lua @@ -1,15 +1,15 @@ normalrule { name = "em_code_ek_h", ins = { - "./make.em.gen", - "util/cmisc+ed", + "./make_codeek_h.lua", + "h/em_table_lib.lua", + "h/em_table", "./em.nogen", - "h/em_table" }, outleaves = { "em_codeEK.h" }, commands = { - "%{ins[1]} %{ins[2]} %{ins[4]} > %{outs}", - "cat %{ins[3]} >> %{outs}" + "$LUA %{ins[1]} < %{ins[3]} > %{outs}", + "cat %{ins[4]} >> %{outs}" } } diff --git a/modules/src/em_code/em.c b/modules/src/em_code/em.c index 407f0d0f2..9987932eb 100644 --- a/modules/src/em_code/em.c +++ b/modules/src/em_code/em.c @@ -104,7 +104,10 @@ int C_open(char* nm) */ if (nm == 0) + { C_ofp = STDOUT; /* standard output */ + sys_setbinarymode(stdout); + } else { diff --git a/modules/src/em_code/make.em.gen b/modules/src/em_code/make.em.gen deleted file mode 100755 index d37d45638..000000000 --- a/modules/src/em_code/make.em.gen +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -echo "/* this part is generated from $2 at: " `date` "*/" -$1 -s $2 <<'EOI' -1,/^$/d -1,/^$/d -1,$s/^\(...\) \(.\).*/\1:\2/ -g/:d/s/^\(...\):\(.\).*/#define C_\1(c) CC_opcst(op_\1, c)/ -g/:[cslnfzor]/s/^\(...\):\(.\).*/#define C_\1(c) CC_opcst(op_\1, c)/ -g/:w/s/^\(...\).*/#define C_\1(w) CC_opcst(op_\1, w)\ -#define C_\1_narg() CC_opnarg(op_\1)/ -g/:g/s/^\(...\).*/#define C_\1(g) CC_opcst(op_\1, g)\ -#define C_\1_dnam(g, o) CC_opdnam(op_\1, g, o)\ -#define C_\1_dlb(g, o) CC_opdlb(op_\1, g, o)/ -g/:p/s/^\(...\).*/#define C_\1(p) CC_oppnam(op_\1, p)/ -g/:b/s/^\(...\).*/#define C_\1(b) CC_opilb(op_\1, b)/ -g/:-/s/^\(...\).*/#define C_\1() CC_op(op_\1)/ -1,$p -EOI diff --git a/modules/src/em_code/make.sh b/modules/src/em_code/make.sh deleted file mode 100755 index 9ee7d44eb..000000000 --- a/modules/src/em_code/make.sh +++ /dev/null @@ -1,20 +0,0 @@ -list= -target=$1 -shift -for i -do - echo "+$cc $cflags $i" - if $cc $cflags $i - then - list="$list `basename $i .c`.$suf" - else - exit 1 - fi -done -echo "+$ar r libem$target.$libsuf $list" -if $ar r libem$target.$libsuf $list -then - : -else - exit 1 -fi diff --git a/modules/src/em_code/make_codeek_h.lua b/modules/src/em_code/make_codeek_h.lua new file mode 100644 index 000000000..2ebf46761 --- /dev/null +++ b/modules/src/em_code/make_codeek_h.lua @@ -0,0 +1,25 @@ +require "h.em_table_lib" + +local specs, pseudos, mnems = load_table() + +for _, mnem in ipairs(mnems) do + if mnem.flags1:find("^[cslndfzor]") then + print(string.format("#define C_%s(c) CC_opcst(op_%s, c)", mnem.name, mnem.name)) + elseif mnem.flags1:find("^w") then + print(string.format("#define C_%s(w) CC_opcst(op_%s, w)", mnem.name, mnem.name)) + print(string.format("#define C_%s_narg() CC_opnarg(op_%s)", mnem.name, mnem.name)) + elseif mnem.flags1:find("^g") then + print(string.format("#define C_%s(g) CC_opcst(op_%s, g)", mnem.name, mnem.name)) + print(string.format("#define C_%s_dnam(g, o) CC_opdnam(op_%s, g, o)", mnem.name, mnem.name)) + print(string.format("#define C_%s_dlb(g, o) CC_opdlb(op_%s, g, o)", mnem.name, mnem.name)) + elseif mnem.flags1:find("^p") then + print(string.format("#define C_%s(p) CC_oppnam(op_%s, p)", mnem.name, mnem.name)) + elseif mnem.flags1:find("^b") then + print(string.format("#define C_%s(b) CC_opilb(op_%s, b)", mnem.name, mnem.name)) + elseif mnem.flags1:find("^-") then + print(string.format("#define C_%s() CC_op(op_%s)", mnem.name, mnem.name)) + else + error("unsupport em_table flag") + end +end + diff --git a/modules/src/em_code/makeem.sed b/modules/src/em_code/makeem.sed deleted file mode 100644 index 8db5d8cc9..000000000 --- a/modules/src/em_code/makeem.sed +++ /dev/null @@ -1,18 +0,0 @@ -1i\ -/* this part is generated from em_table */ -# Remove pseudo instructions -/^\(...\) \([0-9]\).*/d -# Remove opcode constant categories/count -/^\(....\) \([0-9]\).*/d -/^\(.....\) \([0-9]\).*/d -# Below are the actual replacement of opcodes. -s/^\(...\) \(d\).*/#define C_\1(c) CC_opcst(op_\1, c)/ -s/^\(...\) \([cslnfzor]\).*/#define C_\1(c) CC_opcst(op_\1, c)/ -s/^\(...\) \(w\).*/#define C_\1(w) CC_opcst(op_\1, w)\ -#define C_\1_narg() CC_opnarg(op_\1)/ -s/^\(...\) \(g\).*/#define C_\1(g) CC_opcst(op_\1, g)\ -#define C_\1_dnam(g, o) CC_opdnam(op_\1, g, o)\ -#define C_\1_dlb(g, o) CC_opdlb(op_\1, g, o)/ -s/^\(...\) \(p\).*/#define C_\1(p) CC_oppnam(op_\1, p)/ -s/^\(...\) \(b\).*/#define C_\1(b) CC_opilb(op_\1, b)/ -s/^\(...\) \(-\).*/#define C_\1() CC_op(op_\1)/ diff --git a/modules/src/em_data/build.lua b/modules/src/em_data/build.lua index d70369d06..a5e8206df 100644 --- a/modules/src/em_data/build.lua +++ b/modules/src/em_data/build.lua @@ -1,26 +1,33 @@ -local generated = normalrule { - name = "generated", - ins = { - "./new_table", - "util/cmisc+ed", - "h/em_table", -- relative to root, which is a bit evil - }, - outleaves = { - "em_flag.c", - "em_pseu.c", - "em_mnem.c", - "em_spec.h", - "em_pseu.h", - "em_mnem.h", - }, - deps = { - "h+emheaders" - }, - commands = { - "%{ins[1]} %{ins[2]} %{ins[3]} %{dir} %{dir}" - } +local GENFILES = { + "flag.c", + "mnem.c", + "mnem.h", + "pseu.c", + "pseu.h", + "spec.h" } +local generated = {} +for _, f in ipairs(GENFILES) do + generated[#generated+1] = normalrule { + name = "em_"..f:gsub("%.", "_"), + ins = { + "./make_"..f:gsub("%.", "_")..".lua", + "h/em_table_lib.lua", + "h/em_table", -- relative to root, which is a bit evil + }, + outleaves = { + "em_"..f + }, + deps = { + "h+emheaders" + }, + commands = { + "$LUA %{ins[1]} < %{ins[3]} > %{outs}" + } + } +end + clibrary { name = "lib", srcs = concat( @@ -28,10 +35,10 @@ clibrary { matching(filenamesof(generated), "%.c$") ), hdrs = { - "+generated" -- so we export the H files + generated, -- so we export the H files }, deps = { - "+generated", -- so we can see the H files + generated, -- so we can see the H files "h+emheaders" } } diff --git a/modules/src/em_data/make_flag_c.lua b/modules/src/em_data/make_flag_c.lua new file mode 100644 index 000000000..302d327d5 --- /dev/null +++ b/modules/src/em_data/make_flag_c.lua @@ -0,0 +1,21 @@ +require "h.em_table_lib" + +local specs, pseudos, mnems = load_table() + +local function flag(c) + if c == "-" then + return "NO" + else + return c:upper() + end +end + +print("#include ") +print("char em_flag[] = {") +for _, mnem in ipairs(mnems) do + print(string.format("\tPAR_%s | FLO_%s,", + flag(mnem.flags1:sub(1, 1)), + flag(mnem.flags1:sub(2, 2)))) +end +print("};") + diff --git a/modules/src/em_data/make_mnem_c.lua b/modules/src/em_data/make_mnem_c.lua new file mode 100644 index 000000000..0f5d9c5b5 --- /dev/null +++ b/modules/src/em_data/make_mnem_c.lua @@ -0,0 +1,9 @@ +require "h.em_table_lib" + +local specs, pseudos, mnems = load_table() + +print("char em_mnem[][4] = {") +for _, mnem in ipairs(mnems) do + print(string.format('\t"%s",', mnem.name)) +end +print("};") diff --git a/modules/src/em_data/make_mnem_h.lua b/modules/src/em_data/make_mnem_h.lua new file mode 100644 index 000000000..6dc49df33 --- /dev/null +++ b/modules/src/em_data/make_mnem_h.lua @@ -0,0 +1,7 @@ +require "h.em_table_lib" + +local specs, pseudos, mnems = load_table() + +for _, mnem in ipairs(mnems) do + print(string.format("#define op_%s %d", mnem.name, mnem.num)) +end diff --git a/modules/src/em_data/make_pseu_c.lua b/modules/src/em_data/make_pseu_c.lua new file mode 100644 index 000000000..391d507bc --- /dev/null +++ b/modules/src/em_data/make_pseu_c.lua @@ -0,0 +1,9 @@ +require "h.em_table_lib" + +local specs, pseudos, mnems = load_table() + +print("char em_pseu[][4] = {") +for _, pseu in ipairs(pseudos) do + print(string.format('\t"%s",', pseu.name)) +end +print("};") diff --git a/modules/src/em_data/make_pseu_h.lua b/modules/src/em_data/make_pseu_h.lua new file mode 100644 index 000000000..24300f99e --- /dev/null +++ b/modules/src/em_data/make_pseu_h.lua @@ -0,0 +1,7 @@ +require "h.em_table_lib" + +local specs, pseudos, mnems = load_table() + +for _, pseu in ipairs(pseudos) do + print(string.format("#define ps_%s %d", pseu.name, pseu.num)) +end diff --git a/modules/src/em_data/make_spec_h.lua b/modules/src/em_data/make_spec_h.lua new file mode 100644 index 000000000..130a5ad07 --- /dev/null +++ b/modules/src/em_data/make_spec_h.lua @@ -0,0 +1,7 @@ +require "h.em_table_lib" + +local specs, pseudos, mnems = load_table() + +for _, spec in ipairs(specs) do + print(string.format("#define sp_%s %d", spec.name, spec.num)) +end diff --git a/modules/src/em_data/new_table b/modules/src/em_data/new_table deleted file mode 100755 index 70d653989..000000000 --- a/modules/src/em_data/new_table +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/sh -set -e - -ed=$1 -em_table=$2 -h=${3-.} -d=${4-.} - -set `grep fpseu $em_table` -p=$2 -set `grep fmnem $em_table` -m=$2 - -$ed - $em_table <<'A' > X -1,/^$/g/ /s// /gp -A - -$ed - $em_table <<'A' | awk '{$2=$2+'$p'; print}' > Y -1,/^$/d -1,/^$/g/ /s// /gp -A - -$ed - $em_table <<'A' | awk '{print $0,'$m'+i++}' > Z -1,/^$/d -1,/^$/d -1,/^$/g/ /s// /gp -A - -i=`wc -l >X -i=`wc -l >X - -$ed - X <<'A' > $h/em_spec.h -g/^/s//#define sp_/p -A - -$ed - Y <<'A' > $h/em_pseu.h -g/ \(.*\) .*/s// \1/ -g/\(.*\) \(.*\)/s//#define ps_\1 \2/p -A - -$ed - Z <<'A' > $h/em_mnem.h -g/ .* /s// / -g/\(.*\) \(.*\)/s//#define op_\1 \2/p -A - -( -echo 'char em_pseu[][4] = {' -$ed - Y <<'A' -g/\(...\).*/s// "\1",/p -A -echo '};' -) > $d/em_pseu.c - -( -echo 'char em_mnem[][4] = {' -$ed - Z <<'A' -g/\(...\).*/s// "\1",/p -A -echo '};' -) > $d/em_mnem.c - -( -echo '#include -char em_flag[] = {' -$ed - Z <<'A' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ -g/^... /s/// -g/ .*/s/// -g/\(.\)\(.\)/s//PAR_\1 | FLO_\2/ -g/-/s//NO/g -g/.*/s// &,/p -A -echo '};' -) > $d/em_flag.c - -rm X Y Z diff --git a/modules/src/em_mes/build.lua b/modules/src/em_mes/build.lua index b094f4a84..1b4680b0e 100644 --- a/modules/src/em_mes/build.lua +++ b/modules/src/em_mes/build.lua @@ -1,6 +1,19 @@ clibrary { name = "lib", - srcs = { "./*.c" }, + srcs = { + "./C_ms_com.c", + "./C_ms_ego.c", + "./C_ms_emx.c", + "./C_ms_err.c", + "./C_ms_flt.c", + "./C_ms_gto.c", + "./C_ms_opt.c", + "./C_ms_par.c", + "./C_ms_reg.c", + "./C_ms_src.c", + "./C_ms_stb.c", + "./C_ms_std.c", + }, deps = { "h+emheaders", "modules+headers", diff --git a/modules/src/em_opt/outputdfa.c b/modules/src/em_opt/outputdfa.c index 110bdea2f..2a885e3ef 100644 --- a/modules/src/em_opt/outputdfa.c +++ b/modules/src/em_opt/outputdfa.c @@ -48,7 +48,7 @@ PRIVATE void openofile(char *filename) strcpy(ofilename, filename); strcpy(ofiletemp, filename); strcat(ofiletemp, ".new"); - if ((ofile = fopen(ofiletemp, "w")) == NULL) + if ((ofile = fopen(ofiletemp, "wb")) == NULL) { fprintf(stderr, "Fatal Error: cannot open output file %s\n", ofiletemp); sys_stop(S_EXIT); @@ -65,12 +65,12 @@ PRIVATE void installofile(void) register FILE *f1, *f2; register int c1, c2; fclose(ofile); - if ((f1 = fopen(ofiletemp, "r")) == NULL) + if ((f1 = fopen(ofiletemp, "rb")) == NULL) { fprintf(stderr, "Fatal Error: cannont reopen file %s\n", ofiletemp); sys_stop(S_EXIT); } - if ((f2 = fopen(ofilename, "r")) == NULL) + if ((f2 = fopen(ofilename, "rb")) == NULL) { fclose(f1); RENAME(ofiletemp, ofilename); diff --git a/modules/src/flt_arith/build.lua b/modules/src/flt_arith/build.lua index 54aa3b097..e248f9003 100644 --- a/modules/src/flt_arith/build.lua +++ b/modules/src/flt_arith/build.lua @@ -19,7 +19,8 @@ clibrary { hdrs = { "./flt_arith.h" }, deps = { "modules+headers", - "./*.h", + "./flt_arith.h", + "./flt_misc.h", } } diff --git a/modules/src/idf/build.lua b/modules/src/idf/build.lua index ac30ac54e..04e501997 100644 --- a/modules/src/idf/build.lua +++ b/modules/src/idf/build.lua @@ -1,7 +1,10 @@ clibrary { name = "lib", srcs = {}, - hdrs = { "./idf_pkg.*" }, + hdrs = { + "./idf_pkg.body", + "./idf_pkg.spec", + } } diff --git a/modules/src/input/build.lua b/modules/src/input/build.lua index 7f59455e0..bb6c5ac0e 100644 --- a/modules/src/input/build.lua +++ b/modules/src/input/build.lua @@ -1,9 +1,13 @@ clibrary { name = "lib", srcs = { - "./*.c" + "./AtEoIF.c", + "./AtEoIT.c", }, - hdrs = { "./inp_pkg.*" } + hdrs = { + "./inp_pkg.body", + "./inp_pkg.spec", + } } diff --git a/modules/src/malloc/check.c b/modules/src/malloc/check.c index b73e7b797..ea09ed78b 100644 --- a/modules/src/malloc/check.c +++ b/modules/src/malloc/check.c @@ -65,7 +65,7 @@ acquire_malout() { static char buf[BUFSIZ]; if (!malout) { - malout = freopen("mal.out", "w", stderr); + malout = freopen("mal.out", "wb", stderr); setbuf(malout, buf); } } diff --git a/modules/src/object/build.lua b/modules/src/object/build.lua index 6a8bea04e..f6c32aadc 100644 --- a/modules/src/object/build.lua +++ b/modules/src/object/build.lua @@ -1,12 +1,28 @@ clibrary { name = "lib", - srcs = { "./*.c" }, + srcs = { + "./rd_arhdr.c", + "./rd_bytes.c", + "./rd.c", + "./rd_int2.c", + "./rd_int4.c", + "./rd_ranlib.c", + "./rd_unsig2.c", + "./wr_arhdr.c", + "./wr_bytes.c", + "./wr.c", + "./wr_int2.c", + "./wr_int4.c", + "./wr_putc.c", + "./wr_ranlib.c", + }, hdrs = { "./object.h" }, deps = { "modules+headers", "h+local", "h+emheaders", - "./*.h", + "./object.h", + "./obj.h", }, } diff --git a/modules/src/print/format.c b/modules/src/print/format.c index e03717918..fcd5bcf6f 100644 --- a/modules/src/print/format.c +++ b/modules/src/print/format.c @@ -37,12 +37,12 @@ $ */ int _format(char *buf, const char *fmt, va_list argp) { - register char *pf = fmt; - register char *pb = buf; + const char *pf = fmt; + char *pb = buf; while (*pf) { if (*pf == '%') { - register width, base, pad, npad; + int width, base, pad, npad; char *arg; char cbuf[2]; char *badformat = ""; diff --git a/modules/src/read_em/argtype b/modules/src/read_em/argtype deleted file mode 100755 index 8d77b9bb3..000000000 --- a/modules/src/read_em/argtype +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -: argtype lists all em mnemonics that have an argument type equal to -: one of the letters specified in the argument -case x$# in - x2) - ;; - x*) echo "Usage: $0 argtypes " 1>&2 - exit 1 - ;; -esac -$ED -s $2 << A -1,/^\$/d -1,/^\$/d -1,/^\$/g/^\(...\) [$1].*/s//\\1/gp -A diff --git a/modules/src/read_em/build.lua b/modules/src/read_em/build.lua index c1c3c257a..8acbd6d07 100644 --- a/modules/src/read_em/build.lua +++ b/modules/src/read_em/build.lua @@ -1,28 +1,26 @@ normalrule { name = "c_mnem_narg_h", ins = { - "./m_C_mnem_na", - "util/cmisc+ed", + "./make_C_mnem_narg_h.lua", + "h/em_table_lib.lua", "h/em_table", - "./argtype" }, outleaves = "C_mnem_narg.h", commands = { - "%{ins} > %{outs}" + "$LUA %{ins[1]} < %{ins[3]} > %{outs}" } } normalrule { name = "c_mnem_h", ins = { - "./m_C_mnem", - "util/cmisc+ed", + "./make_C_mnem_h.lua", + "h/em_table_lib.lua", "h/em_table", - "./argtype" }, outleaves = "C_mnem.h", commands = { - "%{ins} > %{outs}" + "$LUA %{ins[1]} < %{ins[3]} > %{outs}" } } @@ -56,7 +54,7 @@ local function variant(name, cflags) "modules/src/em_data+lib", "modules/src/string+lib", "modules/src/system+lib", - "./*.h", + "./em_comp.h", } } end diff --git a/modules/src/read_em/m_C_mnem b/modules/src/read_em/m_C_mnem deleted file mode 100755 index c7bbab2d3..000000000 --- a/modules/src/read_em/m_C_mnem +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/sh - -export ED=$1 -EM_TABLE=$2 -ARGTYPE=$3 -echo "switch(p->em_opcode) {" -for i in - cdflnorswz p b -do - list=`$ARGTYPE $i $EM_TABLE` - case $i in - -) args='()' - echo " /* no arguments */" - ;; - cdflnorswz) - args='(p->em_cst)' - echo " /* one integer constant argument */" - ;; - p) - args='(p->em_pnam)' - echo " /* a procedure name argument */" - ;; - b) - -: Grumbl, an instruction label as argument is encoded in a sp_cst2 - - args='((label) (p->em_cst))' - echo " /* An instruction label argument */" - ;; - esac - for i in $list - do - cat << EOF - case op_$i: - C_$i$args; - break; -EOF - done -done -list=`$ARGTYPE g $EM_TABLE` -cat << 'EOF' - default: -/* a "g" argument */ - if (p->em_argtype == nof_ptyp) { - switch(p->em_opcode) { - default: - EM_error = "Illegal mnemonic"; - break; -EOF -for i in $list -do - cat << EOF - case op_$i: - C_${i}_dlb(p->em_dlb, p->em_off); - break; -EOF -done -cat << 'EOF' - } - } - else if (p->em_argtype == sof_ptyp) { - switch(p->em_opcode) { - default: - EM_error = "Illegal mnemonic"; - break; -EOF -for i in $list -do - cat << EOF - case op_$i: - C_${i}_dnam(p->em_dnam, p->em_off); - break; -EOF -done -cat << 'EOF' - } - } - else /*argtype == cst_ptyp */ { - switch(p->em_opcode) { - default: - EM_error = "Illegal mnemonic"; - break; -EOF -for i in $list -do - cat << EOF - case op_$i: - C_$i(p->em_cst); - break; -EOF -done -cat << 'EOF' - } - } -} -EOF diff --git a/modules/src/read_em/m_C_mnem_na b/modules/src/read_em/m_C_mnem_na deleted file mode 100755 index 7b663cb62..000000000 --- a/modules/src/read_em/m_C_mnem_na +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -export ED=$1 -EM_TABLE=$2 -ARGTYPE=$3 -list=`$ARGTYPE w $EM_TABLE` -echo "switch(p->em_opcode) {" -for i in $list -do - cat << EOF - case op_$i: - C_${i}_narg(); - break; -EOF -done -cat << EOF - default: EM_error = "Illegal mnemonic"; -} -EOF diff --git a/modules/src/read_em/make_C_mnem_h.lua b/modules/src/read_em/make_C_mnem_h.lua new file mode 100644 index 000000000..1953efbc3 --- /dev/null +++ b/modules/src/read_em/make_C_mnem_h.lua @@ -0,0 +1,80 @@ +require "h.em_table_lib" + +local specs, pseudos, mnems = load_table() + +local function makecase(flags, args) + for _, mnem in ipairs(mnems) do + if mnem.flags1:find(flags) then + print(string.format('\tcase op_%s:\n\t\tC_%s%s;\n\t\tbreak;', + mnem.name, mnem.name, args)) + end + end +end + +print("switch(p->em_opcode) {") + +print("\t/* no arguments */") +makecase("^-", "()") + +print("\t/* one integer constant argument */") +makecase("^[cdflnorswz]", "(p->em_cst)") + +print("\t/* a procedure name argument */") +makecase("^p", "(p->em_pnam)") + +print("\t/* An instruction label argument */") +makecase("^b", "((label) (p->em_cst))") + +print([[ + default: + /* a "g" argument */ + if (p->em_argtype == nof_ptyp) { + switch(p->em_opcode) { + default: + EM_error = "Illegal mnemonic"; + break; +]]) +for _, mnem in ipairs(mnems) do + if mnem.flags1:find("^g") then + print(string.format('\t\t\t\tcase op_%s:', mnem.name)) + print(string.format('\t\t\t\t\tC_%s_dlb(p->em_dlb, p->em_off);\n\t\t\t\t\tbreak;', + mnem.name)) + end +end +print([[ + } + } + else if (p->em_argtype == sof_ptyp) { + switch(p->em_opcode) { + default: + EM_error = "Illegal mnemonic"; + break; +]]) +for _, mnem in ipairs(mnems) do + if mnem.flags1:find("^g") then + print(string.format('\t\t\t\tcase op_%s:', mnem.name)) + print(string.format('\t\t\t\t\tC_%s_dnam(p->em_dnam, p->em_off);\n\t\t\t\t\tbreak;', + mnem.name)) + end +end +print([[ + } + } + else /*argtype == cst_ptyp */ { + switch(p->em_opcode) { + default: + EM_error = "Illegal mnemonic"; + break; +]]) +for _, mnem in ipairs(mnems) do + if mnem.flags1:find("^g") then + print(string.format('\t\t\t\tcase op_%s:', mnem.name)) + print(string.format('\t\t\t\t\tC_%s(p->em_cst);\n\t\t\t\t\tbreak;', + mnem.name)) + end +end +print([[ + } + } +} +]]) diff --git a/modules/src/read_em/make_C_mnem_narg_h.lua b/modules/src/read_em/make_C_mnem_narg_h.lua new file mode 100644 index 000000000..91ba7aaa4 --- /dev/null +++ b/modules/src/read_em/make_C_mnem_narg_h.lua @@ -0,0 +1,16 @@ +require "h.em_table_lib" + +local specs, pseudos, mnems = load_table() + +print("switch(p->em_opcode) {") +for _, mnem in ipairs(mnems) do + if mnem.flags1:find("^w") then + print(string.format('\tcase op_%s:', mnem.name)) + print(string.format('\t\tC_%s_narg();\n\t\tbreak;', + mnem.name)) + end +end +print([[ + default: EM_error = "Illegal mnemonic"; +} +]]) diff --git a/modules/src/read_em/read_em.c b/modules/src/read_em/read_em.c index 4764d6951..7a3556fd0 100644 --- a/modules/src/read_em/read_em.c +++ b/modules/src/read_em/read_em.c @@ -21,6 +21,7 @@ #include #include #include "alloc.h" +#include "system.h" #include "em_label.h" #include "em_arith.h" #include "em_pseu.h" @@ -136,7 +137,10 @@ EXPORT int EM_open(char *filename) } } else + { fd = stdin; + sys_setbinarymode(stdin); + } EM_filename = filename; init_input(); diff --git a/modules/src/system/build.lua b/modules/src/system/build.lua index b409f697d..500cd59f2 100644 --- a/modules/src/system/build.lua +++ b/modules/src/system/build.lua @@ -1,13 +1,32 @@ clibrary { name = "lib", srcs = { - "./access.c", "./break.c", "./chmode.c", "./close.c", - "./create.c", "./filesize.c","./basename.c","./tmpnam.c", - --"./lock.c", - "./modtime.c", "./open.c", "./read.c", "./remove.c", - "./rename.c", "./seek.c", "./stop.c", "./system.c", - --"./unlock.c”,”./tmpdir.c”, + "./access.c", + "./basename.c", + "./break.c", + "./chmode.c", + "./close.c", + "./create.c", + "./filesize.c", + "./maketempfile.c", + "./modtime.c", + "./open.c", + "./read.c", + "./remove.c", + "./rename.c", + "./seek.c", + "./setbinarymode.c", + "./stop.c", + "./strndup.c", + "./syssystem.c", + "./system.c", + "./tmpdir.c", "./write.c", + --"./lock.c", + --"./unlock.c”, }, hdrs = { "./system.h" }, + deps = { + "modules/src/data+lib", + } } diff --git a/modules/src/system/maketempfile.c b/modules/src/system/maketempfile.c new file mode 100644 index 000000000..8878a5a96 --- /dev/null +++ b/modules/src/system/maketempfile.c @@ -0,0 +1,56 @@ +/* Copyright (c) 2022. See the file License in + * the root directory for more information. + */ +#include +#include +#include +#include +#include +#include +#include "system.h" +#include "astring.h" + +#if defined WIN32 +static unsigned temper(unsigned x) +{ + x ^= x>>11; + x ^= x<<7 & 0x9D2C5680; + x ^= x<<15 & 0xEFC60000; + x ^= x>>18; + return x; +} + +static int rand_r(unsigned *seed) +{ + *seed = *seed * 1103515245 + 12345; + return temper(*seed)/2; +} +#endif + +char* sys_maketempfile(const char* prefix, const char* suffix) +{ + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + + unsigned int seed = (unsigned int)(intptr_t)prefix + ^ (unsigned int)ts.tv_sec ^ (unsigned int)ts.tv_nsec; + const char* tempdir = sys_gettmpdir(); + + for (;;) + { + unsigned int hash = rand_r(&seed); + char* filename = aprintf("%s/ack.%s-%x%s%s", + tempdir, prefix, hash, + ((*suffix == 0) || (*suffix == '.')) ? "" : ".", + suffix); + int fd = open(filename, O_CREAT|O_EXCL|O_RDWR, 0600); + if (fd != -1) + { + close(fd); + return filename; + } + if (errno != EEXIST) + perror("could not create temporary file"); + free(filename); + } +} diff --git a/modules/src/system/open.c b/modules/src/system/open.c index eed31dc13..85fa71e7a 100644 --- a/modules/src/system/open.c +++ b/modules/src/system/open.c @@ -6,8 +6,13 @@ #include #include +#include #include "system.h" +#if !defined WIN32 +#define O_BINARY 0 +#endif + extern File *_get_entry(); int @@ -23,11 +28,11 @@ sys_open(path, flag, filep) return 0; switch (flag) { case OP_READ: - if ((fd = open(path, 0)) < 0) + if ((fd = open(path, O_RDONLY|O_BINARY)) < 0) return 0; break; case OP_APPEND: - if ((fd = open(path, 1)) < 0) { + if ((fd = open(path, O_WRONLY|O_BINARY)) < 0) { if (access(path, 0) == 0) return 0; } @@ -40,7 +45,7 @@ sys_open(path, flag, filep) } /* Fall through */ case OP_WRITE: - if ((fd = creat(path, 0666)) < 0) + if ((fd = open(path, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0666)) < 0) return 0; break; default: diff --git a/modules/src/system/read.c b/modules/src/system/read.c index f84c91de9..654ff406d 100644 --- a/modules/src/system/read.c +++ b/modules/src/system/read.c @@ -7,12 +7,24 @@ #include #include "system.h" -int -sys_read(fp, bufptr, bufsiz, pnbytes) - File *fp; - char *bufptr; - int bufsiz, *pnbytes; +int sys_read(File* fp, char* bufptr, int bufsiz, int* pnbytes) { - if (! fp) return 0; - return (*pnbytes = read(fp->o_fd, bufptr, bufsiz)) >= 0; + if (!fp) + return 0; + + *pnbytes = 0; + while (bufsiz != 0) + { + int len = read(fp->o_fd, bufptr, bufsiz); + if (len < 0) + return 0; + if (len == 0) + return *pnbytes != 0; + + *pnbytes += len; + bufptr += len; + bufsiz -= len; + } + + return 1; } diff --git a/modules/src/system/seek.c b/modules/src/system/seek.c index 97749ae12..ba52b845d 100644 --- a/modules/src/system/seek.c +++ b/modules/src/system/seek.c @@ -8,10 +8,7 @@ #include "system.h" int -sys_seek(fp, off, whence, poff) - File *fp; - long off; - long *poff; +sys_seek(File* fp, long off, int whence, long* poff) { if (! fp) return 0; return (*poff = lseek(fp->o_fd, off, whence)) >= 0; diff --git a/modules/src/system/setbinarymode.c b/modules/src/system/setbinarymode.c new file mode 100644 index 000000000..8a6408e6a --- /dev/null +++ b/modules/src/system/setbinarymode.c @@ -0,0 +1,14 @@ +#include "system.h" +#include + +#if defined WIN32 +#include +#endif + +void sys_setbinarymode(FILE* fp) +{ + #if defined WIN32 + setmode(fileno(fp), O_BINARY); + #endif +} + diff --git a/modules/src/system/strndup.c b/modules/src/system/strndup.c new file mode 100644 index 000000000..798b9b71b --- /dev/null +++ b/modules/src/system/strndup.c @@ -0,0 +1,19 @@ +#include +#include +#include "system.h" + +#if defined WIN32 +/* Really? */ +char* strndup(const char* s, size_t n) +{ + size_t len = strnlen(s, n); + char* ns = malloc(len + 1); + if (!ns) + return NULL; + + ns[len] = '\0'; + memcpy(ns, s, len); + return ns; +} +#endif + diff --git a/modules/src/system/syssystem.c b/modules/src/system/syssystem.c new file mode 100644 index 000000000..c86b0be65 --- /dev/null +++ b/modules/src/system/syssystem.c @@ -0,0 +1,42 @@ +#include +#include +#include "system.h" + +int sys_system(const char* prog, const char* const* arglist) +{ + /* Calculate the maximum length of the command line. */ + + int len = strlen(prog); + for (const char* const* arg = arglist+1; *arg; arg++) + len += strlen(*arg) * 2 + 1; + + /* Now actually build the command line. */ + + char* cmdline = malloc(len + 1); + strcpy(cmdline, prog); + char* p = cmdline + strlen(prog); + + for (const char* const* arg = arglist+1; *arg; arg++) + { + const char* word = *arg; + *p++ = ' '; + + for (;;) + { + char c = *word++; + if (!c) + break; + if ((c == ' ') || (c == '\"') || (c == '\'')) + *p++ = '\\'; + *p++ = c; + } + } + + *p = 0; + + int status = system(cmdline); + + free(cmdline); + return status; +} + diff --git a/modules/src/system/system.h b/modules/src/system/system.h index 598ceb03f..5f596822e 100644 --- a/modules/src/system/system.h +++ b/modules/src/system/system.h @@ -48,6 +48,8 @@ off_t sys_filesize(char *); int sys_chmode(char *, int); /* Return the temporary directory location */ char* sys_gettmpdir(void); +/* Call another program. */ +int sys_system(const char* prog, const char* const* argv); #if 0 int sys_lock(char *); int sys_unlock(char *); @@ -76,10 +78,23 @@ time_t sys_modtime(char *); * * Supports both DOS and UNIX style paths. * */ -void sys_basename(const char *str, register char *dst); +extern void sys_basename(const char *str, register char *dst); -/* Creates a temporary filename. This has - * the same semantics as ISO C90 tmpnam() */ -char* sys_tmpnam(char *buffer); +/* Creates a temporary filename, makes it, and returns a malloc'd string + * containing the filename. */ +extern char* sys_maketempfile(const char* prefix, const char* suffix); + +#if defined WIN32 +/* Really? */ +extern char* strndup(const char* s, size_t n); +#endif + +/* Sets stdin, stdout or stderr to binary mode --- required on Windows, noop on + * sane systems. */ +extern void sys_setbinarymode(FILE* fp); + +/* As system sprintf(), except uses malloc() to allocate a new buffer of the + * right size for the result. */ +extern char* aprintf(const char* format, ...); #endif /* __SYSTEM_INCLUDED__ */ diff --git a/modules/src/system/tmpdir.c b/modules/src/system/tmpdir.c index d02a91b0f..f41de61fa 100644 --- a/modules/src/system/tmpdir.c +++ b/modules/src/system/tmpdir.c @@ -11,17 +11,24 @@ char* sys_gettmpdir(void) char* result = 0; /* Check the UNIX temporary directory */ result = getenv("TMPDIR"); - if (result != 0) + if (result) return result; result = getenv("TMP"); - if (result != 0) + if (result) return result; /* DOS compatible systems */ - result = getenv("TEMP"); - if (result != 0) + result = getenv("temp"); + if (result) return result; - /* Then try current directory */ - return "."; + result = getenv("TEMP"); + if (result) + return result; + /* Then try and guess. */ + #if defined WIN32 + return "."; + #else + return "/tmp"; + #endif } diff --git a/modules/src/system/tmpnam.c b/modules/src/system/tmpnam.c deleted file mode 100644 index 1c58261ac..000000000 --- a/modules/src/system/tmpnam.c +++ /dev/null @@ -1,16 +0,0 @@ -/* Copyright (c) 2019. See the file License in - * the root directory for more information. - * - * Created on: 2019-03-13 - * - */ -#include - -/* This has been placed here, because on some famous platforms, this - * call is completely broken (e.g Windows up to recent versions of CRT) - */ -char* sys_tmpnam(char *buffer) -{ - return tmpnam(buffer); -} - diff --git a/modules/src/system/write.c b/modules/src/system/write.c index 7f87ecc28..af996867c 100644 --- a/modules/src/system/write.c +++ b/modules/src/system/write.c @@ -7,12 +7,21 @@ #include #include "system.h" -int -sys_write(fp, bufptr, nbytes) - File *fp; - char *bufptr; - int nbytes; +int sys_write(File* fp, char* bufptr, int nbytes) { - if (! fp) return 0; - return write(fp->o_fd, bufptr, nbytes) == nbytes; + if (!fp) + return 0; + + while (nbytes != 0) + { + int len = write(fp->o_fd, bufptr, nbytes); + if (len < 0) + return 0; + + bufptr += len; + nbytes -= len; + } + + return 1; } + diff --git a/plat/build.lua b/plat/build.lua index 017628abe..e0519dc1a 100644 --- a/plat/build.lua +++ b/plat/build.lua @@ -48,6 +48,27 @@ definerule("acklibrary", }, function (e) local em = (e.vars.plat or ""):find("^em") + + local function splitter(srcs, num, cmd) + local commands = { + } + local t = {} + local function flush() + commands[#commands+1] = cmd:gsub("%%%%", asstring(t)) + t = {} + end + for _, target in ipairs(srcs) do + t[#t+1] = target + if #t == num then + flush() + end + end + if #t ~= 0 then + flush() + end + return table.concat(commands, " && ") + end + return clibrary { name = e.name, srcs = e.srcs, @@ -56,11 +77,14 @@ definerule("acklibrary", "util/arch+pkg", e.deps }, + vars = { + splitter = splitter + }, _cfile = ackfile, suffix = em and ".m" or ".o", commands = { "rm -f %{outs[1]}", - "ACKDIR=$(INSDIR) $(INSDIR)/bin/aal qc %{outs[1]} %{ins}" + "%{splitter(ins, 100, 'ACKDIR=$(INSDIR) $(INSDIR)/bin/aal qc '..tostring(outs[1])..' %%')}" } } end diff --git a/plat/cpm/emu/bdos.s b/plat/cpm/emu/bdos.s index a2a59487f..0450fb8b6 100644 --- a/plat/cpm/emu/bdos.s +++ b/plat/cpm/emu/bdos.s @@ -1,116 +1,116 @@ -# -.sect .text -.sect .rom -.sect .data -.sect .bss - -.sect .text - -bdos: ! BDOS entry point - out 0xff - ora a - ret - -COLDSTART: ! system startup entry point --- this needs to be four bytes after FBASE. - jmp boot ! 0: Cold start routine -bios: - jmp wboot ! 1: Warm boot - reload command processor - jmp const ! 2: Console status - jmp conin ! 3: Console input - jmp conout ! 4: Console output - jmp list ! 5: Printer output - jmp punch ! 6: Paper tape punch output - jmp reader ! 7: Paper tape reader input - jmp home ! 8: Move disc head to track 0 - jmp seldsk ! 9: Select disc drive - jmp settrk !10: Set track number - jmp setsec !11: Set sector number - jmp setdma !12: Set DMA address - jmp read !13: Read a sector - jmp write !14: Write a sector - -boot: - xra a - sta 3 ! iobyte - sta 4 ! drive - ! falls through -wboot: - mvi a, 0xc3 ! jmp - sta 0 - sta 5 - - lxi h, bios - shld 1 - - lxi h, bdos - shld 6 - - lda 4 ! get the current drive/user - mov c, a - out 1 - -const: - out 2 - ora a - ret - -conin: - out 3 - ora a - ret - -conout: - out 4 - ora a - ret - -list: - out 5 - ora a - ret - -punch: - out 6 - ora a - ret - -reader: - out 7 - ora a - ret - -home: - out 8 - ora a - ret - -seldsk: - out 9 - ora a - ret - -settrk: - out 10 - ora a - ret - -setsec: - out 11 - ora a - ret - -setdma: - out 12 - ora a - ret - -read: - out 13 - ora a - ret - -write: - out 14 - ora a - ret - +# +.sect .text +.sect .rom +.sect .data +.sect .bss + +.sect .text + +bdos: ! BDOS entry point + out 0xff + ora a + ret + +COLDSTART: ! system startup entry point --- this needs to be four bytes after FBASE. + jmp boot ! 0: Cold start routine +bios: + jmp wboot ! 1: Warm boot - reload command processor + jmp const ! 2: Console status + jmp conin ! 3: Console input + jmp conout ! 4: Console output + jmp list ! 5: Printer output + jmp punch ! 6: Paper tape punch output + jmp reader ! 7: Paper tape reader input + jmp home ! 8: Move disc head to track 0 + jmp seldsk ! 9: Select disc drive + jmp settrk !10: Set track number + jmp setsec !11: Set sector number + jmp setdma !12: Set DMA address + jmp read !13: Read a sector + jmp write !14: Write a sector + +boot: + xra a + sta 3 ! iobyte + sta 4 ! drive + ! falls through +wboot: + mvi a, 0xc3 ! jmp + sta 0 + sta 5 + + lxi h, bios + shld 1 + + lxi h, bdos + shld 6 + + lda 4 ! get the current drive/user + mov c, a + out 1 + +const: + out 2 + ora a + ret + +conin: + out 3 + ora a + ret + +conout: + out 4 + ora a + ret + +list: + out 5 + ora a + ret + +punch: + out 6 + ora a + ret + +reader: + out 7 + ora a + ret + +home: + out 8 + ora a + ret + +seldsk: + out 9 + ora a + ret + +settrk: + out 10 + ora a + ret + +setsec: + out 11 + ora a + ret + +setdma: + out 12 + ora a + ret + +read: + out 13 + ora a + ret + +write: + out 14 + ora a + ret + diff --git a/plat/cpm/emu/build.lua b/plat/cpm/emu/build.lua index ce831aa45..158e8f152 100644 --- a/plat/cpm/emu/build.lua +++ b/plat/cpm/emu/build.lua @@ -1,6 +1,8 @@ ackfile { name = "bdos_o", - srcs = { "./*.s" }, + srcs = { + "./bdos.s", + }, vars = { plat = "cpm" }, } @@ -38,7 +40,12 @@ cprogram { name = "emu", srcs = { "+bdos_c", - "./*.c" + "./biosbdos.c", + "./dis8080.c", + "./emulator.c", + "./fileio.c", + "./intel_8080_emulator.c", + "./main.c", }, } diff --git a/plat/cpm/emu/intel_8080_emulator.c b/plat/cpm/emu/intel_8080_emulator.c index af99ba49a..e88e1245d 100644 --- a/plat/cpm/emu/intel_8080_emulator.c +++ b/plat/cpm/emu/intel_8080_emulator.c @@ -1,874 +1,874 @@ -/* - Intel 8080 emulator in C - Written by Mike Chambers, April 2018 - - Use this code for whatever you want. I don't care. It's officially public domain. - Credit would be appreciated. -*/ - -#include -#include -#include -#include "intel_8080_emulator.h" - -#define ALLOW_UNDEFINED - -#define reg16_PSW (((uint16_t)reg8[A] << 8) | (uint16_t)reg8[FLAGS]) -#define reg16_BC (((uint16_t)reg8[B] << 8) | (uint16_t)reg8[C]) -#define reg16_DE (((uint16_t)reg8[D] << 8) | (uint16_t)reg8[E]) -#define reg16_HL (((uint16_t)reg8[H] << 8) | (uint16_t)reg8[L]) - -uint8_t reg8[9], INTE = 0; -uint16_t reg_SP, reg_PC; - -#define set_S() reg8[FLAGS] |= 0x80 -#define set_Z() reg8[FLAGS] |= 0x40 -#define set_AC() reg8[FLAGS] |= 0x10 -#define set_P() reg8[FLAGS] |= 0x04 -#define set_C() reg8[FLAGS] |= 0x01 -#define clear_S() reg8[FLAGS] &= 0x7F -#define clear_Z() reg8[FLAGS] &= 0xBF -#define clear_AC() reg8[FLAGS] &= 0xEF -#define clear_P() reg8[FLAGS] &= 0xFB -#define clear_C() reg8[FLAGS] &= 0xFE -#define test_S() (reg8[FLAGS] & 0x80) -#define test_Z() (reg8[FLAGS] & 0x40) -#define test_AC() (reg8[FLAGS] & 0x10) -#define test_P() (reg8[FLAGS] & 0x04) -#define test_C() (reg8[FLAGS] & 0x01) - -static const uint8_t parity[0x100] = { - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, - 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1 -}; - -uint16_t read_RP(uint8_t rp) { - switch (rp) { - case 0x00: - return reg16_BC; - case 0x01: - return reg16_DE; - case 0x02: - return reg16_HL; - case 0x03: - return reg_SP; - } - return 0; -} - -uint16_t read_RP_PUSHPOP(uint8_t rp) { - switch (rp) { - case 0x00: - return reg16_BC; - case 0x01: - return reg16_DE; - case 0x02: - return reg16_HL; - case 0x03: - return (reg16_PSW | 0x02) & 0xFFD7; - } - return 0; -} - -void write_RP(uint8_t rp, uint8_t lb, uint8_t hb) { - switch (rp) { - case 0x00: - reg8[C] = lb; - reg8[B] = hb; - break; - case 0x01: - reg8[E] = lb; - reg8[D] = hb; - break; - case 0x02: - reg8[L] = lb; - reg8[H] = hb; - break; - case 0x03: - reg_SP = (uint16_t)lb | ((uint16_t)hb << 8); - break; - } -} - -void write16_RP(uint8_t rp, uint16_t value) { - switch (rp) { - case 0x00: - reg8[C] = value & 0x00FF; - reg8[B] = value >> 8; - break; - case 0x01: - reg8[E] = value & 0x00FF; - reg8[D] = value >> 8; - break; - case 0x02: - reg8[L] = value & 0x00FF; - reg8[H] = value >> 8; - break; - case 0x03: - reg_SP = value; - break; - } -} - -void write16_RP_PUSHPOP(uint8_t rp, uint16_t value) { - switch (rp) { - case 0x00: - reg8[C] = value & 0x00FF; - reg8[B] = value >> 8; - break; - case 0x01: - reg8[E] = value & 0x00FF; - reg8[D] = value >> 8; - break; - case 0x02: - reg8[L] = value & 0x00FF; - reg8[H] = value >> 8; - break; - case 0x03: - reg8[FLAGS] = ((value & 0x00FF) | 0x02) & 0xD7; - reg8[A] = value >> 8; - break; - } -} - -void calc_SZP(uint8_t value) { - if (value == 0) set_Z(); else clear_Z(); - if (value & 0x80) set_S(); else clear_S(); - if (parity[value]) set_P(); else clear_P(); -} - -void calc_AC(uint8_t val1, uint8_t val2) { - if (((val1 & 0x0F) + (val2 & 0x0F)) > 0x0F) { - set_AC(); - } else { - clear_AC(); - } -} - -void calc_AC_carry(uint8_t val1, uint8_t val2) { - if (((val1 & 0x0F) + (val2 & 0x0F)) >= 0x0F) { - set_AC(); - } else { - clear_AC(); - } -} - -void calc_subAC(int8_t val1, uint8_t val2) { - if ((val2 & 0x0F) <= (val1 & 0x0F)) { - set_AC(); - } else { - clear_AC(); - } -} - -void calc_subAC_borrow(int8_t val1, uint8_t val2) { - if ((val2 & 0x0F) < (val1 & 0x0F)) { - set_AC(); - } else { - clear_AC(); - } -} - -uint8_t test_cond(uint8_t code) { - switch (code) { - case 0: //Z not set - if (!test_Z()) return 1; else return 0; - case 1: //Z set - if (test_Z()) return 1; else return 0; - case 2: //C not set - if (!test_C()) return 1; else return 0; - case 3: //C set - if (test_C()) return 1; else return 0; - case 4: //P not set - if (!test_P()) return 1; else return 0; - case 5: //P set - if (test_P()) return 1; else return 0; - case 6: //S not set - if (!test_S()) return 1; else return 0; - case 7: //S set - if (test_S()) return 1; else return 0; - } - return 0; -} - -void i8080_push(uint16_t value) { - i8080_write(--reg_SP, value >> 8); - i8080_write(--reg_SP, (uint8_t)value); -} - -uint16_t i8080_pop() { - uint16_t temp; - temp = i8080_read(reg_SP++); - temp |= (uint16_t)i8080_read(reg_SP++) << 8; - return temp; -} - -void i8080_interrupt(uint8_t n) { - if (!INTE) return; - i8080_push(reg_PC); - reg_PC = (uint16_t)n << 3; - INTE = 0; -} - -void i8080_jump(uint16_t addr) { - reg_PC = addr; -} - -void i8080_reset() { - reg_PC = reg_SP = 0x0000; - //reg8[FLAGS] = 0x02; -} - -void i8080_write_reg8(reg_t reg, uint8_t value) { - if (reg == M) { - i8080_write(reg16_HL, value); - } else { - reg8[reg] = value; - } -} - -uint8_t i8080_read_reg8(reg_t reg) { - if (reg == M) { - return i8080_read(reg16_HL); - } else { - return reg8[reg]; - } -} - -uint16_t i8080_read_reg16(reg_t reg) { - switch (reg) { - case AF: return reg16_PSW; - case BC: return reg16_BC; - case DE: return reg16_DE; - case HL: return reg16_HL; - case SP: return reg_SP; - case PC: return reg_PC; - } - return 0; -} - -void i8080_write_reg16(reg_t reg, uint16_t value) { - switch (reg) { - case AF: reg8[A] = value>>8; reg8[FLAGS] = value; break; - case BC: reg8[B] = value>>8; reg8[C] = value; break; - case DE: reg8[D] = value>>8; reg8[E] = value; break; - case HL: reg8[H] = value>>8; reg8[L] = value; break; - case SP: reg_SP = value; break; - case PC: reg_PC = value; break; - } -} - -int i8080_exec(int cycles) { - uint8_t opcode, temp8, reg, reg2; - uint16_t temp16; - uint32_t temp32; - - while (cycles > 0) { - opcode = i8080_read(reg_PC++); - - switch (opcode) { - case 0x3A: //LDA a - load A from memory - temp16 = (uint16_t)i8080_read(reg_PC) | ((uint16_t)i8080_read(reg_PC+1)<<8); - reg8[A] = i8080_read(temp16); - reg_PC += 2; - cycles -= 13; - break; - case 0x32: //STA a - store A to memory - temp16 = (uint16_t)i8080_read(reg_PC) | ((uint16_t)i8080_read(reg_PC+1)<<8); - i8080_write(temp16, reg8[A]); - reg_PC += 2; - cycles -= 13; - break; - case 0x2A: //LHLD a - load H:L from memory - temp16 = (uint16_t)i8080_read(reg_PC) | ((uint16_t)i8080_read(reg_PC+1)<<8); - reg8[L] = i8080_read(temp16++); - reg8[H] = i8080_read(temp16); - reg_PC += 2; - cycles -= 16; - break; - case 0x22: //SHLD a - store H:L to memory - temp16 = (uint16_t)i8080_read(reg_PC) | ((uint16_t)i8080_read(reg_PC+1)<<8); - i8080_write(temp16++, reg8[L]); - i8080_write(temp16, reg8[H]); - reg_PC += 2; - cycles -= 16; - break; - case 0xEB: //XCHG - exchange DE and HL content - temp8 = reg8[D]; - reg8[D] = reg8[H]; - reg8[H] = temp8; - temp8 = reg8[E]; - reg8[E] = reg8[L]; - reg8[L] = temp8; - cycles -= 5; - break; - case 0xC6: //ADI # - add immediate to A - temp8 = i8080_read(reg_PC++); - temp16 = (uint16_t)reg8[A] + (uint16_t)temp8; - if (temp16 & 0xFF00) set_C(); else clear_C(); - calc_AC(reg8[A], temp8); - calc_SZP((uint8_t)temp16); - reg8[A] = (uint8_t)temp16; - cycles -= 7; - break; - case 0xCE: //ACI # - add immediate to A with carry - temp8 = i8080_read(reg_PC++); - temp16 = (uint16_t)reg8[A] + (uint16_t)temp8 + (uint16_t)test_C(); - if (test_C()) calc_AC_carry(reg8[A], temp8); else calc_AC(reg8[A], temp8); - if (temp16 & 0xFF00) set_C(); else clear_C(); - calc_SZP((uint8_t)temp16); - reg8[A] = (uint8_t)temp16; - cycles -= 7; - break; - case 0xD6: //SUI # - subtract immediate from A - temp8 = i8080_read(reg_PC++); - temp16 = (uint16_t)reg8[A] - (uint16_t)temp8; - if (((temp16 & 0x00FF) >= reg8[A]) && temp8) set_C(); else clear_C(); - calc_subAC(reg8[A], temp8); - calc_SZP((uint8_t)temp16); - reg8[A] = (uint8_t)temp16; - cycles -= 7; - break; - case 0x27: //DAA - decimal adjust accumulator - temp16 = reg8[A]; - if (((temp16 & 0x0F) > 0x09) || test_AC()) { - if (((temp16 & 0x0F) + 0x06) & 0xF0) set_AC(); else clear_AC(); - temp16 += 0x06; - if (temp16 & 0xFF00) set_C(); //can also cause carry to be set during addition to the low nibble - } - if (((temp16 & 0xF0) > 0x90) || test_C()) { - temp16 += 0x60; - if (temp16 & 0xFF00) set_C(); //doesn't clear it if this clause is false - } - calc_SZP((uint8_t)temp16); - reg8[A] = (uint8_t)temp16; - cycles -= 4; - break; - case 0xE6: //ANI # - AND immediate with A - temp8 = i8080_read(reg_PC++); - if ((reg8[A] | temp8) & 0x08) set_AC(); else clear_AC(); - reg8[A] &= temp8; - clear_C(); - calc_SZP(reg8[A]); - cycles -= 7; - break; - case 0xF6: //ORI # - OR immediate with A - reg8[A] |= i8080_read(reg_PC++); - clear_AC(); - clear_C(); - calc_SZP(reg8[A]); - cycles -= 7; - break; - case 0xEE: //XRI # - XOR immediate with A - reg8[A] ^= i8080_read(reg_PC++); - clear_AC(); - clear_C(); - calc_SZP(reg8[A]); - cycles -= 7; - break; - case 0xDE: //SBI # - subtract immediate from A with borrow - temp8 = i8080_read(reg_PC++); - temp16 = (uint16_t)reg8[A] - (uint16_t)temp8 - (uint16_t)test_C(); - if (test_C()) calc_subAC_borrow(reg8[A], temp8); else calc_subAC(reg8[A], temp8); - if (((temp16 & 0x00FF) >= reg8[A]) && (temp8 | test_C())) set_C(); else clear_C(); - calc_SZP((uint8_t)temp16); - reg8[A] = (uint8_t)temp16; - cycles -= 7; - break; - case 0xFE: //CPI # - compare immediate with A - temp8 = i8080_read(reg_PC++); - temp16 = (uint16_t)reg8[A] - (uint16_t)temp8; - if (((temp16 & 0x00FF) >= reg8[A]) && temp8) set_C(); else clear_C(); - calc_subAC(reg8[A], temp8); - calc_SZP((uint8_t)temp16); - cycles -= 7; - break; - case 0x07: //RLC - rotate A left - if (reg8[A] & 0x80) set_C(); else clear_C(); - reg8[A] = (reg8[A] >> 7) | (reg8[A] << 1); - cycles -= 4; - break; - case 0x0F: //RRC - rotate A right - if (reg8[A] & 0x01) set_C(); else clear_C(); - reg8[A] = (reg8[A] << 7) | (reg8[A] >> 1); - cycles -= 4; - break; - case 0x17: //RAL - rotate A left through carry - temp8 = test_C(); - if (reg8[A] & 0x80) set_C(); else clear_C(); - reg8[A] = (reg8[A] << 1) | temp8; - cycles -= 4; - break; - case 0x1F: //RAR - rotate A right through carry - temp8 = test_C(); - if (reg8[A] & 0x01) set_C(); else clear_C(); - reg8[A] = (reg8[A] >> 1) | (temp8 << 7); - cycles -= 4; - break; - case 0x2F: //CMA - compliment A - reg8[A] = ~reg8[A]; - cycles -= 4; - break; - case 0x3F: //CMC - compliment carry flag - reg8[FLAGS] ^= 1; - cycles -= 4; - break; - case 0x37: //STC - set carry flag - set_C(); - cycles -= 4; - break; - case 0xC7: //RST n - restart (call n*8) - case 0xD7: - case 0xE7: - case 0xF7: - case 0xCF: - case 0xDF: - case 0xEF: - case 0xFF: - i8080_push(reg_PC); - reg_PC = (uint16_t)((opcode >> 3) & 7) << 3; - cycles -= 11; - break; - case 0xE9: //PCHL - jump to address in H:L - reg_PC = reg16_HL; - cycles -= 5; - break; - case 0xE3: //XTHL - swap H:L with top word on stack - temp16 = i8080_pop(); - i8080_push(reg16_HL); - write16_RP(2, temp16); - cycles -= 18; - break; - case 0xF9: //SPHL - set SP to content of HL - reg_SP = reg16_HL; - cycles -= 5; - break; - case 0xDB: //IN p - read input port into A - reg8[A] = i8080_inport(i8080_read(reg_PC++)); - cycles -= 10; - break; - case 0xD3: //OUT p - write A to output port - i8080_outport(i8080_read(reg_PC++), reg8[A]); - cycles -= 10; - break; - case 0xFB: //EI - enable interrupts - INTE = 1; - cycles -= 4; - break; - case 0xF3: //DI - disbale interrupts - INTE = 0; - cycles -= 4; - break; - case 0x76: //HLT - halt processor - reg_PC--; - cycles -= 7; - break; - case 0x00: //NOP - no operation -#ifdef ALLOW_UNDEFINED - case 0x10: - case 0x20: - case 0x30: - case 0x08: - case 0x18: - case 0x28: - case 0x38: -#endif - cycles -= 4; - break; - case 0x40: case 0x50: case 0x60: case 0x70: //MOV D,S - move register to register - case 0x41: case 0x51: case 0x61: case 0x71: - case 0x42: case 0x52: case 0x62: case 0x72: - case 0x43: case 0x53: case 0x63: case 0x73: - case 0x44: case 0x54: case 0x64: case 0x74: - case 0x45: case 0x55: case 0x65: case 0x75: - case 0x46: case 0x56: case 0x66: - case 0x47: case 0x57: case 0x67: case 0x77: - case 0x48: case 0x58: case 0x68: case 0x78: - case 0x49: case 0x59: case 0x69: case 0x79: - case 0x4A: case 0x5A: case 0x6A: case 0x7A: - case 0x4B: case 0x5B: case 0x6B: case 0x7B: - case 0x4C: case 0x5C: case 0x6C: case 0x7C: - case 0x4D: case 0x5D: case 0x6D: case 0x7D: - case 0x4E: case 0x5E: case 0x6E: case 0x7E: - case 0x4F: case 0x5F: case 0x6F: case 0x7F: - reg = (opcode >> 3) & 7; - reg2 = opcode & 7; - i8080_write_reg8(reg, i8080_read_reg8(reg2)); - if ((reg == M) || (reg2 == M)) { - cycles -= 7; - } else { - cycles -= 5; - } - break; - case 0x06: //MVI D,# - move immediate to register - case 0x16: - case 0x26: - case 0x36: - case 0x0E: - case 0x1E: - case 0x2E: - case 0x3E: - reg = (opcode >> 3) & 7; - i8080_write_reg8(reg, i8080_read(reg_PC++)); - if (reg == M) { - cycles -= 10; - } else { - cycles -= 7; - } - break; - case 0x01: //LXI RP,# - load register pair immediate - case 0x11: - case 0x21: - case 0x31: - reg = (opcode >> 4) & 3; - write_RP(reg, i8080_read(reg_PC), i8080_read(reg_PC + 1)); - reg_PC += 2; - cycles -= 10; - break; - case 0x0A: //LDAX BC - load A indirect through BC - reg8[A] = i8080_read(reg16_BC); - cycles -= 7; - break; - case 0x1A: //LDAX DE - load A indirect through DE - reg8[A] = i8080_read(reg16_DE); - cycles -= 7; - break; - case 0x02: //STAX BC - store A indirect through BC - i8080_write(reg16_BC, reg8[A]); - cycles -= 7; - break; - case 0x12: //STAX DE - store A indirect through DE - i8080_write(reg16_DE, reg8[A]); - cycles -= 7; - break; - case 0x04: //INR D - increment register - case 0x14: - case 0x24: - case 0x34: - case 0x0C: - case 0x1C: - case 0x2C: - case 0x3C: - reg = (opcode >> 3) & 7; - temp8 = i8080_read_reg8(reg); //reg8[reg]; - calc_AC(temp8, 1); - calc_SZP(temp8 + 1); - i8080_write_reg8(reg, temp8 + 1); //reg8[reg]++; - if (reg == M) { - cycles -= 10; - } else { - cycles -= 5; - } - break; - case 0x05: //DCR D - decrement register - case 0x15: - case 0x25: - case 0x35: - case 0x0D: - case 0x1D: - case 0x2D: - case 0x3D: - reg = (opcode >> 3) & 7; - temp8 = i8080_read_reg8(reg); //reg8[reg]; - calc_subAC(temp8, 1); - calc_SZP(temp8 - 1); - i8080_write_reg8(reg, temp8 - 1); //reg8[reg]--; - if (reg == M) { - cycles -= 10; - } else { - cycles -= 5; - } - break; - case 0x03: //INX RP - increment register pair - case 0x13: - case 0x23: - case 0x33: - reg = (opcode >> 4) & 3; - write16_RP(reg, read_RP(reg) + 1); - cycles -= 5; - break; - case 0x0B: //DCX RP - decrement register pair - case 0x1B: - case 0x2B: - case 0x3B: - reg = (opcode >> 4) & 3; - write16_RP(reg, read_RP(reg) - 1); - cycles -= 5; - break; - case 0x09: //DAD RP - add register pair to HL - case 0x19: - case 0x29: - case 0x39: - reg = (opcode >> 4) & 3; - temp32 = (uint32_t)reg16_HL + (uint32_t)read_RP(reg); - write16_RP(2, (uint16_t)temp32); - if (temp32 & 0xFFFF0000) set_C(); else clear_C(); - cycles -= 10; - break; - case 0x80: //ADD S - add register or memory to A - case 0x81: - case 0x82: - case 0x83: - case 0x84: - case 0x85: - case 0x86: - case 0x87: - reg = opcode & 7; - temp8 = i8080_read_reg8(reg); - temp16 = (uint16_t)reg8[A] + (uint16_t)temp8; - if (temp16 & 0xFF00) set_C(); else clear_C(); - calc_AC(reg8[A], temp8); - calc_SZP((uint8_t)temp16); - reg8[A] = (uint8_t)temp16; - if (reg == M) { - cycles -= 7; - } else { - cycles -= 4; - } - break; - case 0x88: //ADC S - add register or memory to A with carry - case 0x89: - case 0x8A: - case 0x8B: - case 0x8C: - case 0x8D: - case 0x8E: - case 0x8F: - reg = opcode & 7; - temp8 = i8080_read_reg8(reg); - temp16 = (uint16_t)reg8[A] + (uint16_t)temp8 + (uint16_t)test_C(); - if (test_C()) calc_AC_carry(reg8[A], temp8); else calc_AC(reg8[A], temp8); - if (temp16 & 0xFF00) set_C(); else clear_C(); - calc_SZP((uint8_t)temp16); - reg8[A] = (uint8_t)temp16; - if (reg == M) { - cycles -= 7; - } else { - cycles -= 4; - } - break; - case 0x90: //SUB S - subtract register or memory from A - case 0x91: - case 0x92: - case 0x93: - case 0x94: - case 0x95: - case 0x96: - case 0x97: - reg = opcode & 7; - temp8 = i8080_read_reg8(reg); - temp16 = (uint16_t)reg8[A] - (uint16_t)temp8; - if (((temp16 & 0x00FF) >= reg8[A]) && temp8) set_C(); else clear_C(); - calc_subAC(reg8[A], temp8); - calc_SZP((uint8_t)temp16); - reg8[A] = (uint8_t)temp16; - if (reg == M) { - cycles -= 7; - } else { - cycles -= 4; - } - break; - case 0x98: //SBB S - subtract register or memory from A with borrow - case 0x99: - case 0x9A: - case 0x9B: - case 0x9C: - case 0x9D: - case 0x9E: - case 0x9F: - reg = opcode & 7; - temp8 = i8080_read_reg8(reg); - temp16 = (uint16_t)reg8[A] - (uint16_t)temp8 - (uint16_t)test_C(); - if (test_C()) calc_subAC_borrow(reg8[A], temp8); else calc_subAC(reg8[A], temp8); - if (((temp16 & 0x00FF) >= reg8[A]) && (temp8 | test_C())) set_C(); else clear_C(); - calc_SZP((uint8_t)temp16); - reg8[A] = (uint8_t)temp16; - if (reg == M) { - cycles -= 7; - } else { - cycles -= 4; - } - break; - case 0xA0: //ANA S - AND register with A - case 0xA1: - case 0xA2: - case 0xA3: - case 0xA4: - case 0xA5: - case 0xA6: - case 0xA7: - reg = opcode & 7; - temp8 = i8080_read_reg8(reg); - if ((reg8[A] | temp8) & 0x08) set_AC(); else clear_AC(); - reg8[A] &= temp8; - clear_C(); - calc_SZP(reg8[A]); - if (reg == M) { - cycles -= 7; - } else { - cycles -= 4; - } - break; - case 0xB0: //ORA S - OR register with A - case 0xB1: - case 0xB2: - case 0xB3: - case 0xB4: - case 0xB5: - case 0xB6: - case 0xB7: - reg = opcode & 7; - reg8[A] |= i8080_read_reg8(reg); - clear_AC(); - clear_C(); - calc_SZP(reg8[A]); - if (reg == M) { - cycles -= 7; - } else { - cycles -= 4; - } - break; - case 0xA8: //XRA S - XOR register with A - case 0xA9: - case 0xAA: - case 0xAB: - case 0xAC: - case 0xAD: - case 0xAE: - case 0xAF: - reg = opcode & 7; - reg8[A] ^= i8080_read_reg8(reg); - clear_AC(); - clear_C(); - calc_SZP(reg8[A]); - if (reg == M) { - cycles -= 7; - } else { - cycles -= 4; - } - break; - case 0xB8: //CMP S - compare register with A - case 0xB9: - case 0xBA: - case 0xBB: - case 0xBC: - case 0xBD: - case 0xBE: - case 0xBF: - reg = opcode & 7; - temp8 = i8080_read_reg8(reg); - temp16 = (uint16_t)reg8[A] - (uint16_t)temp8; - if (((temp16 & 0x00FF) >= reg8[A]) && temp8) set_C(); else clear_C(); - calc_subAC(reg8[A], temp8); - calc_SZP((uint8_t)temp16); - if (reg == M) { - cycles -= 7; - } else { - cycles -= 4; - } - break; - case 0xC3: //JMP a - unconditional jump -#ifdef ALLOW_UNDEFINED - case 0xCB: -#endif - temp16 = (uint16_t)i8080_read(reg_PC) | (((uint16_t)i8080_read(reg_PC + 1)) << 8); - reg_PC = temp16; - cycles -= 10; - break; - case 0xC2: //Jccc - conditional jumps - case 0xCA: - case 0xD2: - case 0xDA: - case 0xE2: - case 0xEA: - case 0xF2: - case 0xFA: - temp16 = (uint16_t)i8080_read(reg_PC) | (((uint16_t)i8080_read(reg_PC + 1)) << 8); - if (test_cond((opcode >> 3) & 7)) reg_PC = temp16; else reg_PC += 2; - cycles -= 10; - break; - case 0xCD: //CALL a - unconditional call -#ifdef ALLOW_UNDEFINED - case 0xDD: - case 0xED: - case 0xFD: -#endif - temp16 = (uint16_t)i8080_read(reg_PC) | (((uint16_t)i8080_read(reg_PC + 1)) << 8); - i8080_push(reg_PC + 2); - reg_PC = temp16; - cycles -= 17; - break; - case 0xC4: //Cccc - conditional calls - case 0xCC: - case 0xD4: - case 0xDC: - case 0xE4: - case 0xEC: - case 0xF4: - case 0xFC: - temp16 = (uint16_t)i8080_read(reg_PC) | (((uint16_t)i8080_read(reg_PC + 1)) << 8); - if (test_cond((opcode >> 3) & 7)) { - i8080_push(reg_PC + 2); - reg_PC = temp16; - cycles -= 17; - } else { - reg_PC += 2; - cycles -= 11; - } - break; - case 0xC9: //RET - unconditional return -#ifdef ALLOW_UNDEFINED - case 0xD9: -#endif - reg_PC = i8080_pop(); - cycles -= 10; - break; - case 0xC0: //Rccc - conditional returns - case 0xC8: - case 0xD0: - case 0xD8: - case 0xE0: - case 0xE8: - case 0xF0: - case 0xF8: - if (test_cond((opcode >> 3) & 7)) { - reg_PC = i8080_pop(); - cycles -= 11; - } else { - cycles -= 5; - } - break; - case 0xC5: //PUSH RP - push register pair on the stack - case 0xD5: - case 0xE5: - case 0xF5: - reg = (opcode >> 4) & 3; - i8080_push(read_RP_PUSHPOP(reg)); - cycles -= 11; - break; - case 0xC1: //POP RP - pop register pair from the stack - case 0xD1: - case 0xE1: - case 0xF1: - reg = (opcode >> 4) & 3; - write16_RP_PUSHPOP(reg, i8080_pop()); - cycles -= 10; - break; - -#ifndef ALLOW_UNDEFINED - default: - printf("UNRECOGNIZED INSTRUCTION @ %04Xh: %02X\n", reg_PC - 1, opcode); - exit(0); -#endif - } - - } - - return cycles; -} +/* + Intel 8080 emulator in C + Written by Mike Chambers, April 2018 + + Use this code for whatever you want. I don't care. It's officially public domain. + Credit would be appreciated. +*/ + +#include +#include +#include +#include "intel_8080_emulator.h" + +#define ALLOW_UNDEFINED + +#define reg16_PSW (((uint16_t)reg8[A] << 8) | (uint16_t)reg8[FLAGS]) +#define reg16_BC (((uint16_t)reg8[B] << 8) | (uint16_t)reg8[C]) +#define reg16_DE (((uint16_t)reg8[D] << 8) | (uint16_t)reg8[E]) +#define reg16_HL (((uint16_t)reg8[H] << 8) | (uint16_t)reg8[L]) + +uint8_t reg8[9], INTE = 0; +uint16_t reg_SP, reg_PC; + +#define set_S() reg8[FLAGS] |= 0x80 +#define set_Z() reg8[FLAGS] |= 0x40 +#define set_AC() reg8[FLAGS] |= 0x10 +#define set_P() reg8[FLAGS] |= 0x04 +#define set_C() reg8[FLAGS] |= 0x01 +#define clear_S() reg8[FLAGS] &= 0x7F +#define clear_Z() reg8[FLAGS] &= 0xBF +#define clear_AC() reg8[FLAGS] &= 0xEF +#define clear_P() reg8[FLAGS] &= 0xFB +#define clear_C() reg8[FLAGS] &= 0xFE +#define test_S() (reg8[FLAGS] & 0x80) +#define test_Z() (reg8[FLAGS] & 0x40) +#define test_AC() (reg8[FLAGS] & 0x10) +#define test_P() (reg8[FLAGS] & 0x04) +#define test_C() (reg8[FLAGS] & 0x01) + +static const uint8_t parity[0x100] = { + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1 +}; + +uint16_t read_RP(uint8_t rp) { + switch (rp) { + case 0x00: + return reg16_BC; + case 0x01: + return reg16_DE; + case 0x02: + return reg16_HL; + case 0x03: + return reg_SP; + } + return 0; +} + +uint16_t read_RP_PUSHPOP(uint8_t rp) { + switch (rp) { + case 0x00: + return reg16_BC; + case 0x01: + return reg16_DE; + case 0x02: + return reg16_HL; + case 0x03: + return (reg16_PSW | 0x02) & 0xFFD7; + } + return 0; +} + +void write_RP(uint8_t rp, uint8_t lb, uint8_t hb) { + switch (rp) { + case 0x00: + reg8[C] = lb; + reg8[B] = hb; + break; + case 0x01: + reg8[E] = lb; + reg8[D] = hb; + break; + case 0x02: + reg8[L] = lb; + reg8[H] = hb; + break; + case 0x03: + reg_SP = (uint16_t)lb | ((uint16_t)hb << 8); + break; + } +} + +void write16_RP(uint8_t rp, uint16_t value) { + switch (rp) { + case 0x00: + reg8[C] = value & 0x00FF; + reg8[B] = value >> 8; + break; + case 0x01: + reg8[E] = value & 0x00FF; + reg8[D] = value >> 8; + break; + case 0x02: + reg8[L] = value & 0x00FF; + reg8[H] = value >> 8; + break; + case 0x03: + reg_SP = value; + break; + } +} + +void write16_RP_PUSHPOP(uint8_t rp, uint16_t value) { + switch (rp) { + case 0x00: + reg8[C] = value & 0x00FF; + reg8[B] = value >> 8; + break; + case 0x01: + reg8[E] = value & 0x00FF; + reg8[D] = value >> 8; + break; + case 0x02: + reg8[L] = value & 0x00FF; + reg8[H] = value >> 8; + break; + case 0x03: + reg8[FLAGS] = ((value & 0x00FF) | 0x02) & 0xD7; + reg8[A] = value >> 8; + break; + } +} + +void calc_SZP(uint8_t value) { + if (value == 0) set_Z(); else clear_Z(); + if (value & 0x80) set_S(); else clear_S(); + if (parity[value]) set_P(); else clear_P(); +} + +void calc_AC(uint8_t val1, uint8_t val2) { + if (((val1 & 0x0F) + (val2 & 0x0F)) > 0x0F) { + set_AC(); + } else { + clear_AC(); + } +} + +void calc_AC_carry(uint8_t val1, uint8_t val2) { + if (((val1 & 0x0F) + (val2 & 0x0F)) >= 0x0F) { + set_AC(); + } else { + clear_AC(); + } +} + +void calc_subAC(int8_t val1, uint8_t val2) { + if ((val2 & 0x0F) <= (val1 & 0x0F)) { + set_AC(); + } else { + clear_AC(); + } +} + +void calc_subAC_borrow(int8_t val1, uint8_t val2) { + if ((val2 & 0x0F) < (val1 & 0x0F)) { + set_AC(); + } else { + clear_AC(); + } +} + +uint8_t test_cond(uint8_t code) { + switch (code) { + case 0: //Z not set + if (!test_Z()) return 1; else return 0; + case 1: //Z set + if (test_Z()) return 1; else return 0; + case 2: //C not set + if (!test_C()) return 1; else return 0; + case 3: //C set + if (test_C()) return 1; else return 0; + case 4: //P not set + if (!test_P()) return 1; else return 0; + case 5: //P set + if (test_P()) return 1; else return 0; + case 6: //S not set + if (!test_S()) return 1; else return 0; + case 7: //S set + if (test_S()) return 1; else return 0; + } + return 0; +} + +void i8080_push(uint16_t value) { + i8080_write(--reg_SP, value >> 8); + i8080_write(--reg_SP, (uint8_t)value); +} + +uint16_t i8080_pop() { + uint16_t temp; + temp = i8080_read(reg_SP++); + temp |= (uint16_t)i8080_read(reg_SP++) << 8; + return temp; +} + +void i8080_interrupt(uint8_t n) { + if (!INTE) return; + i8080_push(reg_PC); + reg_PC = (uint16_t)n << 3; + INTE = 0; +} + +void i8080_jump(uint16_t addr) { + reg_PC = addr; +} + +void i8080_reset() { + reg_PC = reg_SP = 0x0000; + //reg8[FLAGS] = 0x02; +} + +void i8080_write_reg8(reg_t reg, uint8_t value) { + if (reg == M) { + i8080_write(reg16_HL, value); + } else { + reg8[reg] = value; + } +} + +uint8_t i8080_read_reg8(reg_t reg) { + if (reg == M) { + return i8080_read(reg16_HL); + } else { + return reg8[reg]; + } +} + +uint16_t i8080_read_reg16(reg_t reg) { + switch (reg) { + case AF: return reg16_PSW; + case BC: return reg16_BC; + case DE: return reg16_DE; + case HL: return reg16_HL; + case SP: return reg_SP; + case PC: return reg_PC; + } + return 0; +} + +void i8080_write_reg16(reg_t reg, uint16_t value) { + switch (reg) { + case AF: reg8[A] = value>>8; reg8[FLAGS] = value; break; + case BC: reg8[B] = value>>8; reg8[C] = value; break; + case DE: reg8[D] = value>>8; reg8[E] = value; break; + case HL: reg8[H] = value>>8; reg8[L] = value; break; + case SP: reg_SP = value; break; + case PC: reg_PC = value; break; + } +} + +int i8080_exec(int cycles) { + uint8_t opcode, temp8, reg, reg2; + uint16_t temp16; + uint32_t temp32; + + while (cycles > 0) { + opcode = i8080_read(reg_PC++); + + switch (opcode) { + case 0x3A: //LDA a - load A from memory + temp16 = (uint16_t)i8080_read(reg_PC) | ((uint16_t)i8080_read(reg_PC+1)<<8); + reg8[A] = i8080_read(temp16); + reg_PC += 2; + cycles -= 13; + break; + case 0x32: //STA a - store A to memory + temp16 = (uint16_t)i8080_read(reg_PC) | ((uint16_t)i8080_read(reg_PC+1)<<8); + i8080_write(temp16, reg8[A]); + reg_PC += 2; + cycles -= 13; + break; + case 0x2A: //LHLD a - load H:L from memory + temp16 = (uint16_t)i8080_read(reg_PC) | ((uint16_t)i8080_read(reg_PC+1)<<8); + reg8[L] = i8080_read(temp16++); + reg8[H] = i8080_read(temp16); + reg_PC += 2; + cycles -= 16; + break; + case 0x22: //SHLD a - store H:L to memory + temp16 = (uint16_t)i8080_read(reg_PC) | ((uint16_t)i8080_read(reg_PC+1)<<8); + i8080_write(temp16++, reg8[L]); + i8080_write(temp16, reg8[H]); + reg_PC += 2; + cycles -= 16; + break; + case 0xEB: //XCHG - exchange DE and HL content + temp8 = reg8[D]; + reg8[D] = reg8[H]; + reg8[H] = temp8; + temp8 = reg8[E]; + reg8[E] = reg8[L]; + reg8[L] = temp8; + cycles -= 5; + break; + case 0xC6: //ADI # - add immediate to A + temp8 = i8080_read(reg_PC++); + temp16 = (uint16_t)reg8[A] + (uint16_t)temp8; + if (temp16 & 0xFF00) set_C(); else clear_C(); + calc_AC(reg8[A], temp8); + calc_SZP((uint8_t)temp16); + reg8[A] = (uint8_t)temp16; + cycles -= 7; + break; + case 0xCE: //ACI # - add immediate to A with carry + temp8 = i8080_read(reg_PC++); + temp16 = (uint16_t)reg8[A] + (uint16_t)temp8 + (uint16_t)test_C(); + if (test_C()) calc_AC_carry(reg8[A], temp8); else calc_AC(reg8[A], temp8); + if (temp16 & 0xFF00) set_C(); else clear_C(); + calc_SZP((uint8_t)temp16); + reg8[A] = (uint8_t)temp16; + cycles -= 7; + break; + case 0xD6: //SUI # - subtract immediate from A + temp8 = i8080_read(reg_PC++); + temp16 = (uint16_t)reg8[A] - (uint16_t)temp8; + if (((temp16 & 0x00FF) >= reg8[A]) && temp8) set_C(); else clear_C(); + calc_subAC(reg8[A], temp8); + calc_SZP((uint8_t)temp16); + reg8[A] = (uint8_t)temp16; + cycles -= 7; + break; + case 0x27: //DAA - decimal adjust accumulator + temp16 = reg8[A]; + if (((temp16 & 0x0F) > 0x09) || test_AC()) { + if (((temp16 & 0x0F) + 0x06) & 0xF0) set_AC(); else clear_AC(); + temp16 += 0x06; + if (temp16 & 0xFF00) set_C(); //can also cause carry to be set during addition to the low nibble + } + if (((temp16 & 0xF0) > 0x90) || test_C()) { + temp16 += 0x60; + if (temp16 & 0xFF00) set_C(); //doesn't clear it if this clause is false + } + calc_SZP((uint8_t)temp16); + reg8[A] = (uint8_t)temp16; + cycles -= 4; + break; + case 0xE6: //ANI # - AND immediate with A + temp8 = i8080_read(reg_PC++); + if ((reg8[A] | temp8) & 0x08) set_AC(); else clear_AC(); + reg8[A] &= temp8; + clear_C(); + calc_SZP(reg8[A]); + cycles -= 7; + break; + case 0xF6: //ORI # - OR immediate with A + reg8[A] |= i8080_read(reg_PC++); + clear_AC(); + clear_C(); + calc_SZP(reg8[A]); + cycles -= 7; + break; + case 0xEE: //XRI # - XOR immediate with A + reg8[A] ^= i8080_read(reg_PC++); + clear_AC(); + clear_C(); + calc_SZP(reg8[A]); + cycles -= 7; + break; + case 0xDE: //SBI # - subtract immediate from A with borrow + temp8 = i8080_read(reg_PC++); + temp16 = (uint16_t)reg8[A] - (uint16_t)temp8 - (uint16_t)test_C(); + if (test_C()) calc_subAC_borrow(reg8[A], temp8); else calc_subAC(reg8[A], temp8); + if (((temp16 & 0x00FF) >= reg8[A]) && (temp8 | test_C())) set_C(); else clear_C(); + calc_SZP((uint8_t)temp16); + reg8[A] = (uint8_t)temp16; + cycles -= 7; + break; + case 0xFE: //CPI # - compare immediate with A + temp8 = i8080_read(reg_PC++); + temp16 = (uint16_t)reg8[A] - (uint16_t)temp8; + if (((temp16 & 0x00FF) >= reg8[A]) && temp8) set_C(); else clear_C(); + calc_subAC(reg8[A], temp8); + calc_SZP((uint8_t)temp16); + cycles -= 7; + break; + case 0x07: //RLC - rotate A left + if (reg8[A] & 0x80) set_C(); else clear_C(); + reg8[A] = (reg8[A] >> 7) | (reg8[A] << 1); + cycles -= 4; + break; + case 0x0F: //RRC - rotate A right + if (reg8[A] & 0x01) set_C(); else clear_C(); + reg8[A] = (reg8[A] << 7) | (reg8[A] >> 1); + cycles -= 4; + break; + case 0x17: //RAL - rotate A left through carry + temp8 = test_C(); + if (reg8[A] & 0x80) set_C(); else clear_C(); + reg8[A] = (reg8[A] << 1) | temp8; + cycles -= 4; + break; + case 0x1F: //RAR - rotate A right through carry + temp8 = test_C(); + if (reg8[A] & 0x01) set_C(); else clear_C(); + reg8[A] = (reg8[A] >> 1) | (temp8 << 7); + cycles -= 4; + break; + case 0x2F: //CMA - compliment A + reg8[A] = ~reg8[A]; + cycles -= 4; + break; + case 0x3F: //CMC - compliment carry flag + reg8[FLAGS] ^= 1; + cycles -= 4; + break; + case 0x37: //STC - set carry flag + set_C(); + cycles -= 4; + break; + case 0xC7: //RST n - restart (call n*8) + case 0xD7: + case 0xE7: + case 0xF7: + case 0xCF: + case 0xDF: + case 0xEF: + case 0xFF: + i8080_push(reg_PC); + reg_PC = (uint16_t)((opcode >> 3) & 7) << 3; + cycles -= 11; + break; + case 0xE9: //PCHL - jump to address in H:L + reg_PC = reg16_HL; + cycles -= 5; + break; + case 0xE3: //XTHL - swap H:L with top word on stack + temp16 = i8080_pop(); + i8080_push(reg16_HL); + write16_RP(2, temp16); + cycles -= 18; + break; + case 0xF9: //SPHL - set SP to content of HL + reg_SP = reg16_HL; + cycles -= 5; + break; + case 0xDB: //IN p - read input port into A + reg8[A] = i8080_inport(i8080_read(reg_PC++)); + cycles -= 10; + break; + case 0xD3: //OUT p - write A to output port + i8080_outport(i8080_read(reg_PC++), reg8[A]); + cycles -= 10; + break; + case 0xFB: //EI - enable interrupts + INTE = 1; + cycles -= 4; + break; + case 0xF3: //DI - disbale interrupts + INTE = 0; + cycles -= 4; + break; + case 0x76: //HLT - halt processor + reg_PC--; + cycles -= 7; + break; + case 0x00: //NOP - no operation +#ifdef ALLOW_UNDEFINED + case 0x10: + case 0x20: + case 0x30: + case 0x08: + case 0x18: + case 0x28: + case 0x38: +#endif + cycles -= 4; + break; + case 0x40: case 0x50: case 0x60: case 0x70: //MOV D,S - move register to register + case 0x41: case 0x51: case 0x61: case 0x71: + case 0x42: case 0x52: case 0x62: case 0x72: + case 0x43: case 0x53: case 0x63: case 0x73: + case 0x44: case 0x54: case 0x64: case 0x74: + case 0x45: case 0x55: case 0x65: case 0x75: + case 0x46: case 0x56: case 0x66: + case 0x47: case 0x57: case 0x67: case 0x77: + case 0x48: case 0x58: case 0x68: case 0x78: + case 0x49: case 0x59: case 0x69: case 0x79: + case 0x4A: case 0x5A: case 0x6A: case 0x7A: + case 0x4B: case 0x5B: case 0x6B: case 0x7B: + case 0x4C: case 0x5C: case 0x6C: case 0x7C: + case 0x4D: case 0x5D: case 0x6D: case 0x7D: + case 0x4E: case 0x5E: case 0x6E: case 0x7E: + case 0x4F: case 0x5F: case 0x6F: case 0x7F: + reg = (opcode >> 3) & 7; + reg2 = opcode & 7; + i8080_write_reg8(reg, i8080_read_reg8(reg2)); + if ((reg == M) || (reg2 == M)) { + cycles -= 7; + } else { + cycles -= 5; + } + break; + case 0x06: //MVI D,# - move immediate to register + case 0x16: + case 0x26: + case 0x36: + case 0x0E: + case 0x1E: + case 0x2E: + case 0x3E: + reg = (opcode >> 3) & 7; + i8080_write_reg8(reg, i8080_read(reg_PC++)); + if (reg == M) { + cycles -= 10; + } else { + cycles -= 7; + } + break; + case 0x01: //LXI RP,# - load register pair immediate + case 0x11: + case 0x21: + case 0x31: + reg = (opcode >> 4) & 3; + write_RP(reg, i8080_read(reg_PC), i8080_read(reg_PC + 1)); + reg_PC += 2; + cycles -= 10; + break; + case 0x0A: //LDAX BC - load A indirect through BC + reg8[A] = i8080_read(reg16_BC); + cycles -= 7; + break; + case 0x1A: //LDAX DE - load A indirect through DE + reg8[A] = i8080_read(reg16_DE); + cycles -= 7; + break; + case 0x02: //STAX BC - store A indirect through BC + i8080_write(reg16_BC, reg8[A]); + cycles -= 7; + break; + case 0x12: //STAX DE - store A indirect through DE + i8080_write(reg16_DE, reg8[A]); + cycles -= 7; + break; + case 0x04: //INR D - increment register + case 0x14: + case 0x24: + case 0x34: + case 0x0C: + case 0x1C: + case 0x2C: + case 0x3C: + reg = (opcode >> 3) & 7; + temp8 = i8080_read_reg8(reg); //reg8[reg]; + calc_AC(temp8, 1); + calc_SZP(temp8 + 1); + i8080_write_reg8(reg, temp8 + 1); //reg8[reg]++; + if (reg == M) { + cycles -= 10; + } else { + cycles -= 5; + } + break; + case 0x05: //DCR D - decrement register + case 0x15: + case 0x25: + case 0x35: + case 0x0D: + case 0x1D: + case 0x2D: + case 0x3D: + reg = (opcode >> 3) & 7; + temp8 = i8080_read_reg8(reg); //reg8[reg]; + calc_subAC(temp8, 1); + calc_SZP(temp8 - 1); + i8080_write_reg8(reg, temp8 - 1); //reg8[reg]--; + if (reg == M) { + cycles -= 10; + } else { + cycles -= 5; + } + break; + case 0x03: //INX RP - increment register pair + case 0x13: + case 0x23: + case 0x33: + reg = (opcode >> 4) & 3; + write16_RP(reg, read_RP(reg) + 1); + cycles -= 5; + break; + case 0x0B: //DCX RP - decrement register pair + case 0x1B: + case 0x2B: + case 0x3B: + reg = (opcode >> 4) & 3; + write16_RP(reg, read_RP(reg) - 1); + cycles -= 5; + break; + case 0x09: //DAD RP - add register pair to HL + case 0x19: + case 0x29: + case 0x39: + reg = (opcode >> 4) & 3; + temp32 = (uint32_t)reg16_HL + (uint32_t)read_RP(reg); + write16_RP(2, (uint16_t)temp32); + if (temp32 & 0xFFFF0000) set_C(); else clear_C(); + cycles -= 10; + break; + case 0x80: //ADD S - add register or memory to A + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + reg = opcode & 7; + temp8 = i8080_read_reg8(reg); + temp16 = (uint16_t)reg8[A] + (uint16_t)temp8; + if (temp16 & 0xFF00) set_C(); else clear_C(); + calc_AC(reg8[A], temp8); + calc_SZP((uint8_t)temp16); + reg8[A] = (uint8_t)temp16; + if (reg == M) { + cycles -= 7; + } else { + cycles -= 4; + } + break; + case 0x88: //ADC S - add register or memory to A with carry + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + reg = opcode & 7; + temp8 = i8080_read_reg8(reg); + temp16 = (uint16_t)reg8[A] + (uint16_t)temp8 + (uint16_t)test_C(); + if (test_C()) calc_AC_carry(reg8[A], temp8); else calc_AC(reg8[A], temp8); + if (temp16 & 0xFF00) set_C(); else clear_C(); + calc_SZP((uint8_t)temp16); + reg8[A] = (uint8_t)temp16; + if (reg == M) { + cycles -= 7; + } else { + cycles -= 4; + } + break; + case 0x90: //SUB S - subtract register or memory from A + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + reg = opcode & 7; + temp8 = i8080_read_reg8(reg); + temp16 = (uint16_t)reg8[A] - (uint16_t)temp8; + if (((temp16 & 0x00FF) >= reg8[A]) && temp8) set_C(); else clear_C(); + calc_subAC(reg8[A], temp8); + calc_SZP((uint8_t)temp16); + reg8[A] = (uint8_t)temp16; + if (reg == M) { + cycles -= 7; + } else { + cycles -= 4; + } + break; + case 0x98: //SBB S - subtract register or memory from A with borrow + case 0x99: + case 0x9A: + case 0x9B: + case 0x9C: + case 0x9D: + case 0x9E: + case 0x9F: + reg = opcode & 7; + temp8 = i8080_read_reg8(reg); + temp16 = (uint16_t)reg8[A] - (uint16_t)temp8 - (uint16_t)test_C(); + if (test_C()) calc_subAC_borrow(reg8[A], temp8); else calc_subAC(reg8[A], temp8); + if (((temp16 & 0x00FF) >= reg8[A]) && (temp8 | test_C())) set_C(); else clear_C(); + calc_SZP((uint8_t)temp16); + reg8[A] = (uint8_t)temp16; + if (reg == M) { + cycles -= 7; + } else { + cycles -= 4; + } + break; + case 0xA0: //ANA S - AND register with A + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + reg = opcode & 7; + temp8 = i8080_read_reg8(reg); + if ((reg8[A] | temp8) & 0x08) set_AC(); else clear_AC(); + reg8[A] &= temp8; + clear_C(); + calc_SZP(reg8[A]); + if (reg == M) { + cycles -= 7; + } else { + cycles -= 4; + } + break; + case 0xB0: //ORA S - OR register with A + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + reg = opcode & 7; + reg8[A] |= i8080_read_reg8(reg); + clear_AC(); + clear_C(); + calc_SZP(reg8[A]); + if (reg == M) { + cycles -= 7; + } else { + cycles -= 4; + } + break; + case 0xA8: //XRA S - XOR register with A + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + reg = opcode & 7; + reg8[A] ^= i8080_read_reg8(reg); + clear_AC(); + clear_C(); + calc_SZP(reg8[A]); + if (reg == M) { + cycles -= 7; + } else { + cycles -= 4; + } + break; + case 0xB8: //CMP S - compare register with A + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + reg = opcode & 7; + temp8 = i8080_read_reg8(reg); + temp16 = (uint16_t)reg8[A] - (uint16_t)temp8; + if (((temp16 & 0x00FF) >= reg8[A]) && temp8) set_C(); else clear_C(); + calc_subAC(reg8[A], temp8); + calc_SZP((uint8_t)temp16); + if (reg == M) { + cycles -= 7; + } else { + cycles -= 4; + } + break; + case 0xC3: //JMP a - unconditional jump +#ifdef ALLOW_UNDEFINED + case 0xCB: +#endif + temp16 = (uint16_t)i8080_read(reg_PC) | (((uint16_t)i8080_read(reg_PC + 1)) << 8); + reg_PC = temp16; + cycles -= 10; + break; + case 0xC2: //Jccc - conditional jumps + case 0xCA: + case 0xD2: + case 0xDA: + case 0xE2: + case 0xEA: + case 0xF2: + case 0xFA: + temp16 = (uint16_t)i8080_read(reg_PC) | (((uint16_t)i8080_read(reg_PC + 1)) << 8); + if (test_cond((opcode >> 3) & 7)) reg_PC = temp16; else reg_PC += 2; + cycles -= 10; + break; + case 0xCD: //CALL a - unconditional call +#ifdef ALLOW_UNDEFINED + case 0xDD: + case 0xED: + case 0xFD: +#endif + temp16 = (uint16_t)i8080_read(reg_PC) | (((uint16_t)i8080_read(reg_PC + 1)) << 8); + i8080_push(reg_PC + 2); + reg_PC = temp16; + cycles -= 17; + break; + case 0xC4: //Cccc - conditional calls + case 0xCC: + case 0xD4: + case 0xDC: + case 0xE4: + case 0xEC: + case 0xF4: + case 0xFC: + temp16 = (uint16_t)i8080_read(reg_PC) | (((uint16_t)i8080_read(reg_PC + 1)) << 8); + if (test_cond((opcode >> 3) & 7)) { + i8080_push(reg_PC + 2); + reg_PC = temp16; + cycles -= 17; + } else { + reg_PC += 2; + cycles -= 11; + } + break; + case 0xC9: //RET - unconditional return +#ifdef ALLOW_UNDEFINED + case 0xD9: +#endif + reg_PC = i8080_pop(); + cycles -= 10; + break; + case 0xC0: //Rccc - conditional returns + case 0xC8: + case 0xD0: + case 0xD8: + case 0xE0: + case 0xE8: + case 0xF0: + case 0xF8: + if (test_cond((opcode >> 3) & 7)) { + reg_PC = i8080_pop(); + cycles -= 11; + } else { + cycles -= 5; + } + break; + case 0xC5: //PUSH RP - push register pair on the stack + case 0xD5: + case 0xE5: + case 0xF5: + reg = (opcode >> 4) & 3; + i8080_push(read_RP_PUSHPOP(reg)); + cycles -= 11; + break; + case 0xC1: //POP RP - pop register pair from the stack + case 0xD1: + case 0xE1: + case 0xF1: + reg = (opcode >> 4) & 3; + write16_RP_PUSHPOP(reg, i8080_pop()); + cycles -= 10; + break; + +#ifndef ALLOW_UNDEFINED + default: + printf("UNRECOGNIZED INSTRUCTION @ %04Xh: %02X\n", reg_PC - 1, opcode); + exit(0); +#endif + } + + } + + return cycles; +} diff --git a/plat/cpm/libsys/build.lua b/plat/cpm/libsys/build.lua index b7b0c6d8c..1159e0778 100644 --- a/plat/cpm/libsys/build.lua +++ b/plat/cpm/libsys/build.lua @@ -1,6 +1,9 @@ acklibrary { name = "internal", - hdrs = { "./*.h" } + hdrs = { + "./asm.h", + "./cpmsys.h", + } } local bdos_calls = { @@ -125,8 +128,32 @@ end acklibrary { name = "lib", srcs = { - "./*.c", - "./*.s", + "./_bdos.s", + "./_bios_raw.s", + "./_bios.s", + "./bios_sectran.s", + "./bios_seldsk.s", + "./brk.c", + "./close.c", + "./cpm_overwrite_ccp.s", + "./cpm_printstring0.s", + "./cpm_read_random_safe.c", + "./creat.c", + -- "./errno.s", + "./fcb.c", + "./fd.c", + "./getpid.c", + "./_hol0.s", + "./_inn2.s", + "./isatty.c", + "./kill.c", + "./lseek.c", + "./open.c", + "./read.c", + "./signal.c", + "./time.c", + "./_trap.s", + "./write.c", generated }, deps = { diff --git a/plat/cpm/tests/build.lua b/plat/cpm/tests/build.lua index 81d17d4dc..a17dfa47a 100644 --- a/plat/cpm/tests/build.lua +++ b/plat/cpm/tests/build.lua @@ -9,5 +9,7 @@ plat_testsuite { "floats", -- floats aren't supported "long-long", }, - tests = { "./*.c" }, + tests = { + "./parsefcb_c.c", + } } diff --git a/plat/em/libsys/build.lua b/plat/em/libsys/build.lua new file mode 100644 index 000000000..3ba351631 --- /dev/null +++ b/plat/em/libsys/build.lua @@ -0,0 +1,74 @@ +bundle { + name = "srcs", + srcs = { + "./access.e", + "./acct.e", + "./alarm.e", + "./brk.e", + "./chdir.e", + "./chmod.e", + "./chown.e", + "./chroot.e", + "./close.e", + "./creat.e", + "./dup2.e", + "./dup.e", + "./errno.e", + "./execl.e", + "./execle.e", + "./execv.e", + "./execve.e", + "./_exit.e", + "./fork.e", + "./fstat.e", + "./ftime.e", + "./getegid.e", + "./geteuid.e", + "./getgid.e", + "./getpid.e", + "./getuid.e", + "./gtty.c", + "./ioctl.e", + "./isatty.c", + "./kill.e", + "./link.e", + "./lock.e", + "./lseek.e", + "./mknod.e", + "./mount.e", + "./mpxcall.e", + "./nice.e", + "./open.e", + "./pause.e", + "./pipe.e", + "./prof.e", + "./ptrace.e", + "./read.e", + "./sbrk.e", + "./setgid.e", + "./setsig.e", + "./setuid.e", + "./signal.c", + "./sigtrp.e", + "./stat.e", + "./stime.e", + "./stty.c", + "./sync.e", + "./tell.c", + "./time.c", + "./times.e", + "./umask.e", + "./umount.e", + "./unlink.e", + "./utime.e", + "./wait.e", + "./write.e", + } +} + +bundle { + name = "headers", + srcs = { + } +} + diff --git a/plat/em22/libsys/build.lua b/plat/em22/libsys/build.lua index 7fdc388c4..919285da3 100644 --- a/plat/em22/libsys/build.lua +++ b/plat/em22/libsys/build.lua @@ -1,13 +1,10 @@ acklibrary { name = "lib", srcs = { - "./*.e", - "./*.c", - "plat/em/libsys/*.c", - "plat/em/libsys/*.e", + "plat/em/libsys+srcs", }, deps = { - "plat/em/libsys/*.h", + "plat/em/libsys+headers", "lang/cem/libcc.ansi/headers+headers", "plat/em22/include+pkg", "h+emheaders", diff --git a/plat/linux/libsys/build.lua b/plat/linux/libsys/build.lua new file mode 100644 index 000000000..b18eb4ec0 --- /dev/null +++ b/plat/linux/libsys/build.lua @@ -0,0 +1,35 @@ +bundle { + name = "srcs", + srcs = { + "./close.c", + "./creat.c", + "./execve.c", + "./_exit.c", + "./fork.c", + "./getpid.c", + "./gettimeofday.c", + "./_hol0.s", + "./ioctl.c", + "./isatty.c", + "./kill.c", + "./lseek.c", + "./open.c", + "./read.c", + "./sbrk.c", + "./signal.c", + "./sigprocmask.c", + "./unlink.c", + "./wait.c", + "./waitpid.c", + "./write.c", + } +} + +bundle { + name = "headers", + srcs = { + "./libsys.h", + "./syscalls.h", + } +} + diff --git a/plat/linux386/libsys/build.lua b/plat/linux386/libsys/build.lua index 908682d47..63fa3370a 100644 --- a/plat/linux386/libsys/build.lua +++ b/plat/linux386/libsys/build.lua @@ -1,12 +1,13 @@ acklibrary { name = "lib", srcs = { - "./*.s", - "plat/linux/libsys/*.c", - "plat/linux/libsys/*.s", + "./execl.s", + "./_syscall.s", + "./trapno.s", + "plat/linux/libsys+srcs", }, deps = { - "plat/linux/libsys/*.h", + "plat/linux/libsys+headers", "lang/cem/libcc.ansi/headers+headers", "plat/linux386/include+pkg", }, diff --git a/plat/linux68k/emu/sim.h b/plat/linux68k/emu/sim.h index f0f9b0b61..e778006b4 100755 --- a/plat/linux68k/emu/sim.h +++ b/plat/linux68k/emu/sim.h @@ -1,15 +1,15 @@ -#ifndef SIM__HEADER -#define SIM__HEADER - -unsigned int cpu_read_byte(unsigned int address); -unsigned int cpu_read_word(unsigned int address); -unsigned int cpu_read_long(unsigned int address); -void cpu_write_byte(unsigned int address, unsigned int value); -void cpu_write_word(unsigned int address, unsigned int value); -void cpu_write_long(unsigned int address, unsigned int value); -void cpu_pulse_reset(void); -void cpu_set_fc(unsigned int fc); -int cpu_irq_ack(int level); -void cpu_instr_callback(int pc); - -#endif /* SIM__HEADER */ +#ifndef SIM__HEADER +#define SIM__HEADER + +unsigned int cpu_read_byte(unsigned int address); +unsigned int cpu_read_word(unsigned int address); +unsigned int cpu_read_long(unsigned int address); +void cpu_write_byte(unsigned int address, unsigned int value); +void cpu_write_word(unsigned int address, unsigned int value); +void cpu_write_long(unsigned int address, unsigned int value); +void cpu_pulse_reset(void); +void cpu_set_fc(unsigned int fc); +int cpu_irq_ack(int level); +void cpu_instr_callback(int pc); + +#endif /* SIM__HEADER */ diff --git a/plat/linux68k/libsys/build.lua b/plat/linux68k/libsys/build.lua index e0d5b610b..5b16cba3a 100644 --- a/plat/linux68k/libsys/build.lua +++ b/plat/linux68k/libsys/build.lua @@ -1,12 +1,11 @@ acklibrary { name = "lib", srcs = { - "./*.s", - "plat/linux/libsys/*.c", - "plat/linux/libsys/*.s", + "./_syscall.s", + "plat/linux/libsys+srcs", }, deps = { - "plat/linux/libsys/*.h", + "plat/linux/libsys+headers", "lang/cem/libcc.ansi/headers+headers", "plat/linux68k/include+pkg", }, diff --git a/plat/linuxmips/libsys/build.lua b/plat/linuxmips/libsys/build.lua index dffef4742..462f687fc 100644 --- a/plat/linuxmips/libsys/build.lua +++ b/plat/linuxmips/libsys/build.lua @@ -25,7 +25,7 @@ acklibrary { "plat/linux/libsys/write.c", }, deps = { - "plat/linux/libsys/*.h", + "plat/linux/libsys+headers", "lang/cem/libcc.ansi/headers+headers", "plat/linuxmips/include+pkg", }, diff --git a/plat/linuxppc/emu/build.lua b/plat/linuxppc/emu/build.lua index de5208513..0f19e59d8 100644 --- a/plat/linuxppc/emu/build.lua +++ b/plat/linuxppc/emu/build.lua @@ -20,7 +20,10 @@ clibrary { cprogram { name = "emuppc", - srcs = { "./*.c" }, + srcs = { + "./emu.c", + "./main.c", + }, deps = { "+dispatcher_lib" } diff --git a/plat/linuxppc/libsys/build.lua b/plat/linuxppc/libsys/build.lua index 8d7086aa0..be5658cd2 100644 --- a/plat/linuxppc/libsys/build.lua +++ b/plat/linuxppc/libsys/build.lua @@ -27,7 +27,7 @@ acklibrary { "plat/linux/libsys/write.c", }, deps = { - "plat/linux/libsys/*.h", + "plat/linux/libsys+headers", "lang/cem/libcc.ansi/headers+headers", "plat/linuxppc/include+pkg", }, diff --git a/plat/msdos86/libsys/build.lua b/plat/msdos86/libsys/build.lua index dd357082a..eddbbf262 100644 --- a/plat/msdos86/libsys/build.lua +++ b/plat/msdos86/libsys/build.lua @@ -1,8 +1,39 @@ acklibrary { name = "lib", srcs = { - "./*.c", - "./*.s", + "./brk.c", + "./close.s", + "./creat.c", + "./errno.s", + "./getpid.s", + "./gettimeofday.c", + "./_hol0.s", + "./isatty.s", + "./kill.c", + "./lseek.c", + "./open.c", + "./read.c", + "./setmode.c", + "./signal.c", + "./sys_exists.s", + "./sys_fdmodes.c", + "./sys_getdate.s", + "./sys_getmode.c", + "./sys_gettime.s", + "./sys_initmain.c", + "./sys_iseof.c", + "./sys_isopen.s", + "./sys_isreadyr.s", + "./sys_rawcreat.s", + "./sys_rawlseek.s", + "./sys_rawopen.s", + "./sys_rawrw.s", + "./sys_seteof.c", + "./sys_seterrno.c", + "./sys_setmode.c", + "./sys_xret.s", + "./unlink.s", + "./write.c", }, deps = { "lang/cem/libcc.ansi/headers+headers", diff --git a/plat/pc86/emu/build.lua b/plat/pc86/emu/build.lua index b3b81f15f..c8a970861 100644 --- a/plat/pc86/emu/build.lua +++ b/plat/pc86/emu/build.lua @@ -3,7 +3,15 @@ clibrary { vars = { ["+cflags"] = {"-Iplat/pc86/emu/x86emu", "-DDEBUG"} }, - srcs = {"./x86emu/*.c"} + srcs = { + "./x86emu/debug.c", + "./x86emu/decode.c", + "./x86emu/fpu.c", + "./x86emu/ops2.c", + "./x86emu/ops.c", + "./x86emu/prim_ops.c", + "./x86emu/sys.c", + } } cprogram { diff --git a/plat/pc86/libsys/build.lua b/plat/pc86/libsys/build.lua index a30ecae9e..285db8f12 100644 --- a/plat/pc86/libsys/build.lua +++ b/plat/pc86/libsys/build.lua @@ -1,8 +1,22 @@ acklibrary { name = "lib", srcs = { - "./*.c", - "./*.s", + "./brk.c", + "./close.c", + "./creat.c", + "./errno.s", + "./getpid.c", + "./_hol0.s", + "./isatty.c", + "./kill.c", + "./lseek.c", + "./open.c", + "./read.c", + "./signal.c", + "./_sys_rawread.s", + "./_sys_rawwrite.s", + "./time.c", + "./write.c", }, deps = { "lang/cem/libcc.ansi/headers+headers", diff --git a/plat/pdpv7/libsys/build.lua b/plat/pdpv7/libsys/build.lua index 27c90a8d1..ae51150f9 100644 --- a/plat/pdpv7/libsys/build.lua +++ b/plat/pdpv7/libsys/build.lua @@ -1,8 +1,87 @@ acklibrary { name = "lib", srcs = { - "./*.c", - "./*.s", + "./access.s", + "./acct.s", + "./alarm.s", + "./chdir.s", + "./chmod.s", + "./chown.s", + "./chroot.s", + "./cleanup.c", + "./close.s", + "./creat.s", + "./dup.s", + "./errno.s", + "./execle.s", + "./execl.s", + "./execve.s", + "./execv.s", + "./exit.c", + "./_exit.s", + "./fetchi.s", + "./fork.s", + "./fperr.s", + "./fstat.s", + "./ftime.s", + "./getgid.s", + "./getgrp.s", + "./getpid.s", + "./getppid.s", + "./getuid.s", + "./gldav.s", + "./gtty.c", + "./ioctl.s", + "./isatty.c", + "./killbkg.s", + "./killpg.s", + "./kill.s", + "./link.s", + "./lock.s", + "./login.s", + "./lseek.s", + "./lstat.s", + "./mknod.s", + "./mount.s", + "./mpxcall.s", + "./nice.s", + "./nostk.s", + "./open.s", + "./pause.s", + "./phys.s", + "./pipe.s", + "./profil.s", + "./ptrace.s", + "./qfstat.s", + "./qstat.s", + "./quota.s", + "./readlink.s", + "./read.s", + "./reboot.s", + "./renice.s", + "./rtp.s", + "./sbrk.s", + "./setgid.s", + "./setgrp.s", + "./setuid.s", + "./signal.s", + "./stat.s", + "./stime.s", + "./stty.c", + "./submit.s", + "./symlink.s", + "./sync.s", + "./time.s", + "./times.s", + "./ucall.s", + "./umask.s", + "./umount.s", + "./unlink.s", + "./utime.s", + "./vfork.s", + "./vhangup.s", + "./wait.s", + "./write.s", }, deps = { "lang/cem/libcc.ansi/headers+headers", diff --git a/plat/rpi/libsys/build.lua b/plat/rpi/libsys/build.lua index db579d41b..114df8751 100644 --- a/plat/rpi/libsys/build.lua +++ b/plat/rpi/libsys/build.lua @@ -1,8 +1,27 @@ acklibrary { name = "lib", srcs = { - "./*.c", - "./*.s", + "./brk.c", + "./close.c", + "./creat.c", + "./errno.s", + "./getpid.c", + "./_hol0.s", + "./isatty.c", + "./kill.c", + "./lseek.c", + "./open.c", + "./pi_fast_mode.s", + "./pi_phys_to_user.s", + "./pi_uart.s", + "./pi_user_to_phys.s", + "./read.c", + "./select.c", + "./signal.c", + "./tcgetattr.c", + "./tcsetattr.c", + "./time.c", + "./write.c", }, deps = { "lang/cem/libcc.ansi/headers+headers", diff --git a/tests/plat/b/build.lua b/tests/plat/b/build.lua new file mode 100644 index 000000000..841c49612 --- /dev/null +++ b/tests/plat/b/build.lua @@ -0,0 +1,9 @@ +bundle { + name = "srcs", + srcs = { + "./control_b.b", + "./incdec_b.b", + "./operators_b.b", + } +} + diff --git a/tests/plat/bugs/build.lua b/tests/plat/bugs/build.lua new file mode 100644 index 000000000..833d0f120 --- /dev/null +++ b/tests/plat/bugs/build.lua @@ -0,0 +1,12 @@ +bundle { + name = "srcs", + srcs = { + "./bug-157-i80-varargs_c.c", + "./bug-164-faddrn_c.c", + "./bug-203-ego-sr_c-O3.c", + "./bug-22-inn_mod.mod", + "./bug-62-notvar_var_e.c", + } +} + + diff --git a/tests/plat/build.lua b/tests/plat/build.lua index 0ae4a5c19..cbc5632d1 100644 --- a/tests/plat/build.lua +++ b/tests/plat/build.lua @@ -20,7 +20,7 @@ definerule("plat_testsuite", end for _, set in ipairs(e.sets) do if not skipsets[set] then - local fs = filenamesof("tests/plat/"..set.."/*") + local fs = filenamesof("tests/plat/"..set.."+srcs") for _, f in ipairs(fs) do testfiles[#testfiles+1] = f end diff --git a/tests/plat/core/build.lua b/tests/plat/core/build.lua new file mode 100644 index 000000000..f6a60cf90 --- /dev/null +++ b/tests/plat/core/build.lua @@ -0,0 +1,42 @@ +bundle { + name = "srcs", + srcs = { + "./aar_e.e", + "./and_e.e", + "./andv_e.e", + "./brk_c.c", + "./bss_e.c", + "./calloc_c.c", + "./cii_e.e", + "./cmi_e.e", + "./cms_e.e", + "./cmu_e.e", + "./csa_e.c", + "./csb_e.c", + "./_dummy_e.c", + "./dup_e.e", + "./exg_e.e", + "./inn_e.e", + "./intadd_e.c", + "./intcmp_e.c", + "./intdiv_e.c", + "./intrem_e.c", + "./intshift_e.c", + "./intsub_e.c", + "./ior_e.e", + "./iorv_e.e", + "./lar_e.e", + "./newdispose_p.p", + "./pascalsets_p.p", + "./rck_e.e", + "./rotate_e.e", + "./sar_e.e", + "./set_e.e", + "./setjmp_c.c", + "./structcopy_e.c", + "./xor_e.e", + "./xorv_e.e", + } +} + + diff --git a/tests/plat/floats/build.lua b/tests/plat/floats/build.lua new file mode 100644 index 000000000..066bc32de --- /dev/null +++ b/tests/plat/floats/build.lua @@ -0,0 +1,12 @@ +bundle { + name = "srcs", + srcs = { + "./doublecmp_e.c", + "./from_d_to_si_e.c", + "./from_d_to_ui_e.c", + "./from_si_to_d_e.c", + "./from_ui_to_d_e.c", + } +} + + diff --git a/tests/plat/lib/build.lua b/tests/plat/lib/build.lua new file mode 100644 index 000000000..bdfa15edc --- /dev/null +++ b/tests/plat/lib/build.lua @@ -0,0 +1,7 @@ +bundle { + name = "srcs", + srcs = { + } +} + + diff --git a/tests/plat/long-long/build.lua b/tests/plat/long-long/build.lua new file mode 100644 index 000000000..e1fb5f3b1 --- /dev/null +++ b/tests/plat/long-long/build.lua @@ -0,0 +1,15 @@ +bundle { + name = "srcs", + srcs = { + "./lladdsub_e.c", + "./llbitset_e.c", + "./llcmp_e.c", + "./llconvert_e.c", + "./lldivrem_e.c", + "./llmul_e.c", + "./llshift_e.c", + "./llswitch_e.c", + } +} + + diff --git a/tests/plat/m2/build.lua b/tests/plat/m2/build.lua new file mode 100644 index 000000000..c212d5f5c --- /dev/null +++ b/tests/plat/m2/build.lua @@ -0,0 +1,13 @@ +bundle { + name = "srcs", + srcs = { + "./ConvTest_mod.mod", + "./NestProc_mod.mod", + "./OpenArray_mod.mod", + "./SemaTest_mod.mod", + "./Set100_mod.mod", + "./StringTest_mod.mod", + } +} + + diff --git a/util/LLgen/build.lua b/util/LLgen/build.lua index ea7cdf122..8e5bd4ca7 100644 --- a/util/LLgen/build.lua +++ b/util/LLgen/build.lua @@ -1,6 +1,13 @@ clibrary { name = "headers", - hdrs = { "./src/*.h" } -- rm alloc.h + hdrs = { + "./src/cclass.h", + "./src/extern.h", + "./src/io.h", + "./src/Lpars.h", + "./src/sets.h", + "./src/types.h", + } } cprogram { @@ -10,11 +17,28 @@ cprogram { -- tokens.c. If LLgen.g or tokens.g gets updated, they need -- rebuilding. Use the bootstrap target to do this. - srcs = { "./src/*.c" }, + srcs = { + "./src/LLgen.c", + "./src/Lpars.c", + "./src/alloc.c", + "./src/cclass.c", + "./src/check.c", + "./src/compute.c", + "./src/gencode.c", + "./src/global.c", + "./src/machdep.c", + "./src/main.c", + "./src/name.c", + "./src/reach.c", + "./src/savegram.c", + "./src/sets.c", + "./src/tokens.c", + "./src/utils.c", + }, deps = { "+headers" }, vars = { ["+cflags"] = { - "-DLIBDIR=\\\""..posix.getcwd().."/"..cwd().."/lib\\\"", + "-DLIBDIR=\\\""..cwd().."/lib\\\"", "-DNON_CORRECTING" }, } @@ -55,8 +79,11 @@ definerule("llgen", "util/LLgen+llgen", e.srcs, }, + vars = { + srcs = e.srcs + }, commands = { - "cd %{dir} && rm -f %{outs} && %{abspath(ins)}" + "rm -f %{outs} && %{ins[1]} -o%{dirname(outs[1])} %{srcs}" } } end diff --git a/util/LLgen/doc/LLgen.1 b/util/LLgen/doc/LLgen.1 index 0436ffa30..a50b900b3 100644 --- a/util/LLgen/doc/LLgen.1 +++ b/util/LLgen/doc/LLgen.1 @@ -76,6 +76,9 @@ If the flag is given more than once, will be more "verbose". If it is given three times, a complete description of the grammar will be supplied. +.IP \fB\-o\fP +Specifies the location of the output files. If not set, they +are placed in the current directory. .IP \fB\-x\fP the sets that are computed are extended with the nonterminal symbols and these extended sets are also included in the diff --git a/util/LLgen/src/extern.h b/util/LLgen/src/extern.h index d3b3b89d6..82d861dba 100644 --- a/util/LLgen/src/extern.h +++ b/util/LLgen/src/extern.h @@ -97,37 +97,40 @@ extern int strip_grammar; extern int in_production; /* LLgen.g */ -void LLparse(void); +extern void LLparse(void); /* check.c */ -void conflchecks(void); +extern void conflchecks(void); /* compute.c */ -void do_compute(void); -int empty(p_gram); -int t_safety(int, int, int, int); -int t_after(int, int, int); +extern void do_compute(void); +extern int empty(p_gram); +extern int t_safety(int, int, int, int); +extern int t_after(int, int, int); /* gencode.c */ -void gencode(int); +extern void gencode(int); /* machdep.c */ -void TMPNAM(string); -string libpath(string); +extern string maketempfile(void); +extern string libpath(string); /* main.c */ -void error(int lineno,string s,string t); -void warning(int lineno,string s,string t); -void fatal(int lineno,string s,string t); -void copyfile(string); -void install(string, string); +extern void error(int lineno,string s,string t); +extern void warning(int lineno,string s,string t); +extern void fatal(int lineno,string s,string t); +extern void copyfile(string); +extern void install(string, string); /* name.c */ -void name_init(void); -string store(string); -p_gram search(int, string, int); +extern void name_init(void); +extern string store(string); +extern p_gram search(int, string, int); /* reach.c */ -void co_reach(void); +extern void co_reach(void); + +/* utils.c */ +extern string aprintf(const char* fmt, ...); #endif /* EXTERN_H_ */ diff --git a/util/LLgen/src/gencode.c b/util/LLgen/src/gencode.c index c3c6d36e6..0c24f74f2 100644 --- a/util/LLgen/src/gencode.c +++ b/util/LLgen/src/gencode.c @@ -1510,5 +1510,11 @@ STATIC void correct_prefix(void) fprintf(f, "#define LLstartsymb %sstartsymb\n", s); #endif } - fprintf(f, "#include \"%s\"\n", f_include); + + string leaf = strrchr(f_include, '/'); + if (leaf) + leaf++; + else + leaf = f_include; + fprintf(f, "#include \"%s\"\n", leaf); } diff --git a/util/LLgen/src/global.c b/util/LLgen/src/global.c index e2fcc8599..8333f3684 100644 --- a/util/LLgen/src/global.c +++ b/util/LLgen/src/global.c @@ -45,15 +45,16 @@ FILE *fout; FILE *fpars; FILE *finput; FILE *fact; -char f_pars[L_tmpnam+sizeof(char)]; /* Add one more character for NULL, just in case of buggy implementations. */ -char f_temp[L_tmpnam+sizeof(char)]; +string f_dir; +string f_pars; +string f_temp; #ifdef NON_CORRECTING -char f_nc[20]; +string f_nc; #endif -char f_out[20]; +string f_out; string f_input; -char f_include[20]; -char f_rec[20]; +string f_include; +string f_rec; string e_noopen = "Cannot open %s"; int verbose; int wflag; diff --git a/util/LLgen/src/io.h b/util/LLgen/src/io.h index fdfe0d630..552f28867 100644 --- a/util/LLgen/src/io.h +++ b/util/LLgen/src/io.h @@ -16,26 +16,28 @@ * Some important file names and variables */ -# include +#include +#include "types.h" /* FILES */ -# define OUTFILE "%s.output" /* -v option */ -# define HFILE "%spars.h" /* file for "#define's " */ -# define RFILE "%spars.c" /* Error recovery */ +# define OUTFILE "%s/%s.output" /* -v option */ +# define HFILE "%s/%spars.h" /* file for "#define's " */ +# define RFILE "%s/%spars.c" /* Error recovery */ #ifdef NON_CORRECTING -# define NCFILE "%sncor.c" /* Non-corrcting error recovery */ +# define NCFILE "%s/%sncor.c" /* Non-corrcting error recovery */ #endif extern FILE *finput; extern FILE *fpars; extern FILE *fact; extern FILE *fout; -extern char f_pars[]; -extern char f_temp[]; -extern char f_out[]; -extern string f_input; -extern char f_include[]; -extern char f_rec[]; +extern string f_dir; +extern string f_pars; +extern string f_temp; +extern string f_out; +extern string f_input; +extern string f_include; +extern string f_rec; #ifdef NON_CORRECTING -extern char f_nc[]; +extern string f_nc; #endif diff --git a/util/LLgen/src/machdep.c b/util/LLgen/src/machdep.c index cf43119d4..602edcb61 100644 --- a/util/LLgen/src/machdep.c +++ b/util/LLgen/src/machdep.c @@ -18,6 +18,10 @@ #include #include #include +#include +#if defined WIN32 +#include +#endif # include "extern.h" # include "types.h" @@ -39,18 +43,20 @@ string libpath(string s) char* libdir = getenv("LLGEN_LIB_DIR"); if (!libdir) libdir = LIBDIR; - length = strlen(libdir) + strlen(s) + 2; - p = (string) alloc(length); - strcpy(p,libdir); - strcat(p,"/"); - strcat(p,s); - return p; + return aprintf("%s/%s", libdir, s); } -void TMPNAM(string result) +string maketempfile() { - if (tmpnam(result)==NULL) - { + string tmp = getenv("TMP"); + if (!tmp) + tmp = "/tmp"; + + string filename = aprintf("%s/llgen-XXXXXX", tmp); + int fd = mkstemp(filename); + if (fd == -1) fatal(1, "Cannot create temporary file.", NULL); - } + + close(fd); + return filename; } diff --git a/util/LLgen/src/main.c b/util/LLgen/src/main.c index 217214f68..4cc711323 100644 --- a/util/LLgen/src/main.c +++ b/util/LLgen/src/main.c @@ -37,8 +37,9 @@ int main(int argc, register string argv[]) { register string arg; - TMPNAM(f_temp); - TMPNAM(f_pars); + f_dir = "."; + f_temp = maketempfile(); + f_pars = maketempfile(); /* Initialize */ @@ -116,6 +117,12 @@ int main(int argc, register string argv[]) case 'G': strip_grammar = 1; continue; + + case 'o': + case 'O': + f_dir = ++arg; + break; + default: fprintf(stderr, "illegal option : %c\n", *arg); exit(1); @@ -170,16 +177,16 @@ int main(int argc, register string argv[]) } name_init(); readgrammar(argc, argv); - sprintf(f_out, OUTFILE, prefix ? prefix : "LL"); + f_out = aprintf(OUTFILE, f_dir, prefix ? prefix : "LL"); /* for the following two filenames only one L is used; historical reasons ... */ - sprintf(f_include, HFILE, prefix ? prefix : "L"); - sprintf(f_rec, RFILE, prefix ? prefix : "L"); + f_include = aprintf(HFILE, f_dir, prefix ? prefix : "L"); + f_rec = aprintf(RFILE, f_dir, prefix ? prefix : "L"); #ifdef NON_CORRECTING if (non_corr) - sprintf(f_nc, NCFILE, prefix ? prefix : "L"); + f_nc = aprintf(NCFILE, f_dir, prefix ? prefix : "L"); #endif setinit(ntneeded); maxnt = &nonterms[nnonterms]; @@ -367,6 +374,15 @@ void copyto(string target, string source) fclose(ftarget); } +static int isabspath(string path) +{ + if (path[0] == '/') /* Unix paths */ + return 1; + if (path[0] && (path[1] == ':')) /* Windows paths */ + return 1; + return 0; +} + void install(string target, string source) { /* @@ -377,6 +393,7 @@ void install(string target, string source) register int c1, c2; register FILE *f1, *f2; int cnt; + string realtarget = !isabspath(target) ? aprintf("%s/%s", f_dir, target) : target; /* * First open temporary, generated for source @@ -388,10 +405,10 @@ void install(string target, string source) /* * Now open target for reading */ - if ((f2 = fopen(target, "r")) == NULL) + if ((f2 = fopen(realtarget, "r")) == NULL) { fclose(f1); - copyto(target, f_pars); + copyto(realtarget, f_pars); return; } /* @@ -420,6 +437,6 @@ void install(string target, string source) { fatal(0, "%s : not a file generated by LLgen", target); } - copyto(target, f_pars); + copyto(realtarget, f_pars); } } diff --git a/util/LLgen/src/utils.c b/util/LLgen/src/utils.c new file mode 100644 index 000000000..7da06e9fa --- /dev/null +++ b/util/LLgen/src/utils.c @@ -0,0 +1,27 @@ +#include +#include +#include + +const char* aprintf(const char* fmt, ...) +{ + int n; + char* p; + va_list ap; + + va_start(ap, fmt); + n = vsnprintf(NULL, 0, fmt, ap) + 1; + va_end(ap); + + p = malloc(n); + if (!p) + return NULL; + + va_start(ap, fmt); + vsnprintf(p, n, fmt, ap); + va_end(ap); + + return p; +} + +/* vim: set sw=4 ts=4 expandtab : */ + diff --git a/util/ack/build.lua b/util/ack/build.lua index cb9b66fd4..cd865332b 100644 --- a/util/ack/build.lua +++ b/util/ack/build.lua @@ -34,6 +34,8 @@ cprogram { deps = { "h+emheaders", "h+local", + "modules/src/data+lib", + "modules/src/system+lib", "./ack.h", "./data.h", "./dmach.h", diff --git a/util/ack/files.c b/util/ack/files.c index e5f00dac3..f72ff57ca 100644 --- a/util/ack/files.c +++ b/util/ack/files.c @@ -7,6 +7,7 @@ #include #include #include +#include "system.h" #include "ack.h" #include "list.h" #include "trans.h" @@ -52,16 +53,11 @@ int setfiles(trf *phase) { out.p_keeps=NO ; out.p_keep=YES ; } else { - gr_init(&pathname) ; if ( !phase->t_keep && !t_flag ) { - char* tmpdir = getenv("TMPDIR"); - if (!tmpdir) - tmpdir = "/tmp"; - gr_cat(&pathname, tmpdir); - gr_cat(&pathname, "/Ack-XXXXXX"); - mkstemp(pathname.gr_string); + out.p_path = sys_maketempfile("ack", phase->t_out); out.p_keep=NO ; } else { + gr_init(&pathname) ; if ( !p_basename ) { gr_cat(&pathname,"Ack") ; p_basename=keeps(gr_start(pathname)) ; @@ -70,10 +66,10 @@ int setfiles(trf *phase) { } else { gr_cat(&pathname,p_basename) ; } + gr_cat(&pathname,phase->t_out) ; + out.p_path= gr_final(&pathname) ; out.p_keep=YES ; } - gr_cat(&pathname,phase->t_out) ; - out.p_path= gr_final(&pathname) ; out.p_keeps= YES ; } scanlist( l_first(arguments), elem) { diff --git a/util/ack/main.c b/util/ack/main.c index 26e884972..b466d6025 100644 --- a/util/ack/main.c +++ b/util/ack/main.c @@ -21,7 +21,6 @@ static char rcs_id[] = "$Id$"; static char rcs_ack[] = RCS_ACK; #endif -static int sigs[] = { SIGINT, SIGHUP, SIGTERM, 0 }; static int arg_count; static char* srcvar(void); @@ -57,12 +56,8 @@ int main(int argc, char** argv) } if (callname) { - if (machine) - { - fuerror("can not produce code for both %s and %s", - callname, machine); - } - machine = callname; + if (!machine) + machine = callname; } if (!machine && !(machine = getenv("ACKM"))) { @@ -86,13 +81,8 @@ int main(int argc, char** argv) if (n_error && !k_flag) exit(n_error); - for (n_sig = sigs; *n_sig; n_sig++) - { - if (signal(*n_sig, noodstop) == SIG_IGN) - { - signal(*n_sig, SIG_IGN); - } - } + if (signal(SIGINT, noodstop) == SIG_IGN) + signal(SIGINT, SIG_IGN); scanlist(l_first(arguments), elem) { @@ -121,8 +111,7 @@ int main(int argc, char** argv) #ifdef DEBUG if (debug) { - vprint("phase %s is blocked\n", - phase->t_name); + vprint("phase %s is blocked\n", phase->t_name); } #endif disc_inputs(phase); @@ -337,6 +326,8 @@ static void firstarg(char* argp) register char* name; name = strrchr(argp, '/'); + if (!name) + name = strrchr(argp, '\\'); if (name && *(name + 1)) { name++; @@ -402,8 +393,7 @@ static int process(char* arg) */ tmp->t_visited = YES; if (tmp->t_priority < 0) - werror("Using phase %s (negative priority)", - tmp->t_name); + werror("Using phase %s (negative priority)", tmp->t_name); if (!rts && tmp->t_rts) rts = tmp->t_rts; if (tmp->t_needed) @@ -472,13 +462,11 @@ static int startrf(trf* first) { if (!orig.p_path) { - vprint("phase %s failed\n", - phase->t_name); + vprint("phase %s failed\n", phase->t_name); } else { - vprint("phase %s for %s failed\n", - phase->t_name, orig.p_path); + vprint("phase %s for %s failed\n", phase->t_name, orig.p_path); } } #endif @@ -490,8 +478,7 @@ static int startrf(trf* first) { #ifdef DEBUG if (debug) - vprint("Transformation sequence complete for %s\n", - orig.p_path); + vprint("Transformation sequence complete for %s\n", orig.p_path); #endif /* No more work on this file */ if (!in.p_keep) @@ -543,9 +530,15 @@ static int mayprep(void) static void scanneeds(void) { register list_elem* elem; - scanlist(l_first(head_list), elem) { setneeds(l_content(*elem), 0); } + scanlist(l_first(head_list), elem) + { + setneeds(l_content(*elem), 0); + } l_clear(&head_list); - scanlist(l_first(tail_list), elem) { setneeds(l_content(*elem), 1); } + scanlist(l_first(tail_list), elem) + { + setneeds(l_content(*elem), 1); + } l_clear(&tail_list); } @@ -572,8 +565,7 @@ static void setneeds(const char* suffix, int tail) werror("\"%s\": unrecognized suffix", suffix); break; case F_NOPATH: - werror("sorry, cannot produce the desired file(s) from %s files", - suffix); + werror("sorry, cannot produce the desired file(s) from %s files", suffix); break; } } diff --git a/util/ack/run.c b/util/ack/run.c index b51b44937..2ed761bbc 100644 --- a/util/ack/run.c +++ b/util/ack/run.c @@ -4,7 +4,6 @@ * */ -#include #include #include #include @@ -16,141 +15,165 @@ #include "grows.h" #include "data.h" #include +#include "system.h" #ifndef NORCSID -static char rcs_id[] = "$Id$" ; +static char rcs_id[] = "$Id$"; #endif -#define ARG_MORE 40 /* The size of args chunks to allocate */ +#if !defined WIN32 +#define O_BINARY 0 +#endif -static int run_exec(trf *, const char *); -static void x_arg(char *); +#define ARG_MORE 40 /* The size of args chunks to allocate */ -static char **arglist ; /* The first argument */ -static unsigned argcount ; /* The current number of arguments */ -static unsigned argmax; /* The maximum number of arguments so far */ +static int run_exec(trf*); +static void x_arg(char*); -int runphase(trf *phase) { - register list_elem *elem ; - char *prog ; int result ; +static char** arglist; /* The first argument */ +static unsigned argcount; /* The current number of arguments */ +static unsigned argmax; /* The maximum number of arguments so far */ - prog=phase->t_prog ; - if ( v_flag || debug ) { - if ( v_flag==1 && !debug ) { - vprint("%s",phase->t_name) ; - if ( !phase->t_combine ) { - vprint(" %s%s\n",p_basename, - strrchr(in.p_path,SUFCHAR) ) ; - } else { - scanlist(l_first(phase->t_inputs), elem) { - vprint(" %s",p_cont(*elem)->p_path); +int runphase(trf* phase) +{ + register list_elem* elem; + char* prog; + int result; + + prog = phase->t_prog; + if (v_flag || debug) + { + if (v_flag == 1 && !debug) + { + vprint("%s", phase->t_name); + if (!phase->t_combine) + { + vprint(" %s%s\n", p_basename, strrchr(in.p_path, SUFCHAR)); + } + else + { + scanlist(l_first(phase->t_inputs), elem) + { + vprint(" %s", p_cont(*elem)->p_path); } - vprint("\n") ; + vprint("\n"); } - } else { + } + else + { /* list all args */ - vprint("%s",prog) ; - scanlist(l_first(phase->t_flags), elem) { - vprint(" %s",l_content(*elem)) ; + vprint("%s", prog); + scanlist(l_first(phase->t_flags), elem) + { + vprint(" %s", l_content(*elem)); } - scanlist(l_first(phase->t_args), elem) { - vprint(" %s",l_content(*elem)) ; + scanlist(l_first(phase->t_args), elem) + { + vprint(" %s", l_content(*elem)); } - vprint("\n") ; + vprint("\n"); } } - argcount=0 ; - x_arg(phase->t_name) ; - scanlist(l_first(phase->t_flags), elem) { - x_arg(l_content(*elem)) ; + argcount = 0; + x_arg(phase->t_name); + scanlist(l_first(phase->t_flags), elem) + { + x_arg(l_content(*elem)); } - scanlist(l_first(phase->t_args), elem) { - x_arg(l_content(*elem)) ; + scanlist(l_first(phase->t_args), elem) + { + x_arg(l_content(*elem)); } - x_arg( (char *)0 ) ; - result=run_exec(phase,prog) ; - return result ; + x_arg((char*)0); + result = run_exec(phase); + return result; } -static int run_exec(trf *phase, const char *prog) { - int status, child, waitchild ; +static int run_exec(trf* phase) +{ + int status, child, waitchild; + int oldstdin = -1; + int oldstdout = -1; - fflush(stdout) ; - fflush(stderr) ; - child= fork() ; - if ( child== - 1) { - fatal("Cannot fork %s", prog) ; - } - if ( child ) { - /* The parent */ - do { - waitchild= wait(&status) ; - if ( waitchild== -1 ) { - fatal("missing child") ; - } - } while ( waitchild!=child) ; - if ( status ) { - switch ( status&0177 ) { - case 0 : - break ; - case SIGHUP: - case SIGINT: - case SIGQUIT: - case SIGTERM: - quit(-5) ; - default: - error("%s died with signal %d", - prog,status&0177) ; - } - /* The assumption is that processes voluntarely - dying with a non-zero status already produced - some sort of error message to the outside world. - */ - n_error++ ; - return 0 ; - } - return 1 ; /* From the parent */ - } - /* The child */ - if ( phase->t_stdin ) { - if ( !in.p_path ) { - fatal("no input file for %s",phase->t_name) ; - } - close(0) ; - if ( open(in.p_path,0)!=0 ) { - error("cannot open %s",in.p_path) ; - exit(1) ; + fflush(stdout); + fflush(stderr); + + if (phase->t_stdin) + { + if (!in.p_path) + fatal("no input file for %s", phase->t_name); + + oldstdin = dup(0); + close(0); + if (open(in.p_path, O_RDONLY|O_BINARY) != 0) + { + error("cannot open %s", in.p_path); + exit(1); } } - if ( phase->t_stdout ) { - if ( !out.p_path ) { - fatal("no output file for %s",phase->t_name) ; - } - close(1) ; - if ( creat(out.p_path,0666)!=1 ) { - close(1); dup(2); - error("cannot create %s",out.p_path) ; - exit(1) ; + + if (phase->t_stdout) + { + if (!out.p_path) + fatal("no output file for %s", phase->t_name); + + oldstdout = dup(1); + close(1); + if (open(out.p_path, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0666) != 1) + { + close(1); + dup(2); + error("cannot create %s", out.p_path); + exit(1); } } - execv(prog,arglist) ; - if ( phase->t_stdout ) { close(1) ; dup(2) ; } - error("Cannot execute %s",prog) ; - exit(1) ; - /*NOTREACHED*/ + + status = sys_system(phase->t_prog, (const char* const*) arglist); + + if (oldstdin != -1) + { + close(0); + dup2(oldstdin, 0); + close(oldstdin); + } + + if (oldstdout != -1) + { + close(1); + dup2(oldstdout, 1); + close(oldstdout); + } + + if (status) + { + if (status & 0177) + error("%s died with signal %d", phase->t_prog, status & 0177); + + /* The assumption is that processes voluntarely + dying with a non-zero status already produced + some sort of error message to the outside world. + */ + n_error++; + return 0; + } + return 1; } -static void x_arg(char *string) { +static void x_arg(char* string) +{ /* Add one execute argument to the argument vector */ - if ( argcount==argmax ) { - if ( argmax==0 ) { - argmax= 2*ARG_MORE ; - arglist= (char **)getcore(argmax*sizeof (char *)) ; - } else { - argmax += ARG_MORE ; - arglist= (char **)changecore((char *)arglist, - argmax*sizeof (char *)) ; + if (argcount == argmax) + { + if (argmax == 0) + { + argmax = 2 * ARG_MORE; + arglist = (char**)getcore(argmax * sizeof(char*)); + } + else + { + argmax += ARG_MORE; + arglist = (char**)changecore((char*)arglist, argmax * sizeof(char*)); } } - *(arglist+argcount++) = string ; + *(arglist + argcount++) = string; } diff --git a/util/amisc/abmodules.c b/util/amisc/abmodules.c index b77c7e96b..6a711ad9f 100644 --- a/util/amisc/abmodules.c +++ b/util/amisc/abmodules.c @@ -151,7 +151,7 @@ int main(int argc, char* const argv[]) switch (opt) { case 'o': - outputfp = fopen(optarg, "w"); + outputfp = fopen(optarg, "wb"); if (!outputfp) fatal("cannot open output file: %s", strerror(errno)); break; diff --git a/util/amisc/aelflod.c b/util/amisc/aelflod.c index 98ef2a44a..083fdf2f5 100644 --- a/util/amisc/aelflod.c +++ b/util/amisc/aelflod.c @@ -691,14 +691,14 @@ int main(int argc, char* argv[]) break; case 3: /* Both input and output files specified. */ - output = fopen(argv[2], "w"); + output = fopen(argv[2], "wb"); if (!output) fatal("unable to open output file."); outputfile = argv[2]; /* fall through */ case 2: /* Input file specified. */ - input = fopen(argv[1], "r"); + input = fopen(argv[1], "rb"); if (!input) fatal("unable to open input file."); break; diff --git a/util/amisc/aslod.c b/util/amisc/aslod.c index cfccaec28..850c805f1 100644 --- a/util/amisc/aslod.c +++ b/util/amisc/aslod.c @@ -221,14 +221,14 @@ int main(int argc, char* argv[]) break; case 3: /* Both input and output files specified. */ - output = fopen(argv[2], "w"); + output = fopen(argv[2], "wb"); if (!output) fatal("unable to open output file."); outputfile = argv[2]; /* fall through */ case 2: /* Input file specified. */ - input = fopen(argv[1], "r"); + input = fopen(argv[1], "rb"); if (!input) fatal("unable to open input file."); break; diff --git a/util/amisc/astrip.c b/util/amisc/astrip.c index fcccb3474..11ba03892 100644 --- a/util/amisc/astrip.c +++ b/util/amisc/astrip.c @@ -6,7 +6,6 @@ #include #include -#include #include #include "system.h" #include "object.h" @@ -18,7 +17,7 @@ */ -char tname[L_tmpnam]; +char* tname; FILE *tf; struct outhead buf; int readerror, writeerror; @@ -31,15 +30,7 @@ int main(int argc, char **argv) { int status; - signal(SIGHUP, SIG_IGN); - signal(SIGINT, SIG_IGN); - signal(SIGQUIT, SIG_IGN); - if (sys_tmpnam(tname)==NULL) - { - fprintf(stderr, "astrip: cannot create temporary filename\n"); - return(1); - } - fclose(fopen(tname,"wb")); + tname = sys_maketempfile("ack", "dat"); while(--argc) { if ((status = strip(argv[argc])) > 1) break; diff --git a/util/arch/archiver.c b/util/arch/archiver.c index 98fc79375..bc1b01557 100644 --- a/util/arch/archiver.c +++ b/util/arch/archiver.c @@ -120,8 +120,7 @@ char io_buffer[IO_SIZE]; char *progname; -char temp_buf[L_tmpnam]; -char *temp_arch = &temp_buf[0]; +char *temp_arch; void do_object(FILE* f, long size); void do_names(struct outhead *headp); @@ -348,10 +347,7 @@ int main(int argc, char *argv[]) distr_time = statbuf.st_mtime; } #endif - if (sys_tmpnam(temp_arch) == NULL) - { - error(TRUE, "Cannot create a temporary filename\n", NULL); - } + temp_arch = sys_maketempfile("aal", "dat"); if (app_fl + ex_fl + del_fl + rep_fl + show_fl + pr_fl != 1) usage(); diff --git a/util/arch/build.lua b/util/arch/build.lua index 160b9c21f..eff8e22ad 100644 --- a/util/arch/build.lua +++ b/util/arch/build.lua @@ -3,6 +3,7 @@ cprogram { srcs = { "./archiver.c" }, deps = { "h+emheaders", + "modules/src/data+lib", "modules/src/object+lib", "modules/src/print+lib", "modules/src/string+lib", diff --git a/util/ass/ass00.c b/util/ass/ass00.c index 2459ce7a5..a45f3d63b 100644 --- a/util/ass/ass00.c +++ b/util/ass/ass00.c @@ -153,7 +153,7 @@ static void argument(char *arg) return; } curfile = arg; /* for error messages etc. */ - if ((ifile = fopen(arg, "r")) == NULL) + if ((ifile = fopen(arg, "rb")) == NULL) { error("can't open %s", arg); return; @@ -385,10 +385,10 @@ void init_files(void) * It has the nice property of generating truly unique names. */ - tfile = fopen(tmpfil(), "w+"); - dfile = fopen(tmpfil(), "w+"); - rtfile = fopen(tmpfil(), "w+"); - rdfile = fopen(tmpfil(), "w+"); + tfile = fopen(tmpfil(), "wb+"); + dfile = fopen(tmpfil(), "wb+"); + rtfile = fopen(tmpfil(), "wb+"); + rdfile = fopen(tmpfil(), "wb+"); } void initproc(void) diff --git a/util/ass/ass80.c b/util/ass/ass80.c index 21ca7cf76..168a4a2b6 100644 --- a/util/ass/ass80.c +++ b/util/ass/ass80.c @@ -17,7 +17,7 @@ * this file contains several library routines. */ -static char filename[L_tmpnam]; +static char* filename; /* VARARGS1 */ @@ -384,9 +384,5 @@ void set_mode(int mode) char* tmpfil(void) { - if (sys_tmpnam(filename)==NULL) - { - fatal("Cannot create temporary filename."); - } - return filename; + return sys_maketempfile("ack-ass", "dat"); } diff --git a/util/ass/assrl.c b/util/ass/assrl.c index b748d4718..2da8645c6 100644 --- a/util/ass/assrl.c +++ b/util/ass/assrl.c @@ -127,7 +127,7 @@ void copyout(void) if (remtext != 0) remtext = wordsize - remtext; - if ((ifile = fopen(eout, "w")) == 0) + if ((ifile = fopen(eout, "wb")) == 0) fatal("can't create e.out"); rewind(tfile); diff --git a/util/ass/build.lua b/util/ass/build.lua index 17b60d03d..f46668cc8 100644 --- a/util/ass/build.lua +++ b/util/ass/build.lua @@ -26,7 +26,17 @@ normalrule { cprogram { name = "em_ass", srcs = { - "./ass*.c", + "./ass00.c", + "./ass30.c", + "./ass40.c", + "./ass50.c", + "./ass60.c", + "./ass70.c", + "./ass80.c", + "./assci.c", + "./asscm.c", + "./assda.c", + "./assrl.c", "+asstb", }, deps = { @@ -34,10 +44,14 @@ cprogram { "h+local", --"modules/src/alloc+lib", "modules/src/em_data+lib", - --"modules/src/data+lib", + "modules/src/data+lib", --"modules/src/object+lib", "modules/src/system+lib", - "./ass*.h", + "./ass00.h", + "./assci.h", + "./asscm.h", + "./assex.h", + "./assrl.h", } } diff --git a/util/byacc/ACKNOWLEDGEMENTS b/util/byacc/ACKNOWLEDGEMENTS deleted file mode 100644 index b66bb2506..000000000 --- a/util/byacc/ACKNOWLEDGEMENTS +++ /dev/null @@ -1,25 +0,0 @@ - Berkeley Yacc owes much to the unflagging efforts of Keith Bostic. -His badgering kept me working on it long after I was ready to quit. - - Berkeley Yacc is based on the excellent algorithm for computing LALR(1) -lookaheads developed by Tom Pennello and Frank DeRemer. The algorithm is -described in their almost impenetrable article in TOPLAS 4,4. - - Finally, much of the credit for the latest version must go to those -who pointed out deficiencies of my earlier releases. Among the most -prolific contributors were - - Benson I. Margulies - Dave Gentzel - Antoine Verheijen - Peter S. Housel - Dale Smith - Ozan Yigit - John Campbell - Bill Sommerfeld - Paul Hilfinger - Gary Bridgewater - Dave Bakken - Dan Lanciani - Richard Sargent - Parag Patel diff --git a/util/byacc/NEW_FEATURES b/util/byacc/NEW_FEATURES deleted file mode 100644 index b030c625b..000000000 --- a/util/byacc/NEW_FEATURES +++ /dev/null @@ -1,46 +0,0 @@ - The -r option has been implemented. The -r option tells Yacc to -put the read-only tables in y.tab.c and the code and variables in -y.code.c. Keith Bostic asked for this option so that :yyfix could be -eliminated. - - The -l and -t options have been implemented. The -l option tells -Yacc not to include #line directives in the code it produces. The -t -option causes debugging code to be included in the compiled parser. - - The code for error recovery has been changed to implement the same -algorithm as AT&T Yacc. There will still be differences in the way -error recovery works because AT&T Yacc uses more default reductions -than Berkeley Yacc. - - The environment variable TMPDIR determines the directory where -temporary files will be created. If TMPDIR is defined, temporary files -will be created in the directory whose pathname is the value of TMPDIR. -By default, temporary files are created in /tmp. - - The keywords are now case-insensitive. For example, %nonassoc, -%NONASSOC, %NonAssoc, and %nOnAsSoC are all equivalent. - - Commas and semicolons that are not part of C code are treated as -commentary. - - Line-end comments, as in BCPL, are permitted. Line-end comments -begin with // and end at the next end-of-line. Line-end comments are -permitted in C code; they are converted to C comments on output. - - The form of y.output files has been changed to look more like -those produced by AT&T Yacc. - - A new kind of declaration has been added. The form of the declaration -is - - %ident string - -where string is a sequence of characters begining with a double quote -and ending with either a double quote or the next end-of-line, whichever -comes first. The declaration will cause a #ident directive to be written -near the start of the output file. - - If a parser has been compiled with debugging code, that code can be -enabled by setting an environment variable. If the environment variable -YYDEBUG is set to 0, debugging output is suppressed. If it is set to 1, -debugging output is written to standard output. diff --git a/util/byacc/NO_WARRANTY b/util/byacc/NO_WARRANTY deleted file mode 100644 index 06e8d93a2..000000000 --- a/util/byacc/NO_WARRANTY +++ /dev/null @@ -1,3 +0,0 @@ - Berkeley Yacc is distributed with no warranty whatever. The author -and any other contributors take no responsibility for the consequences of -its use. diff --git a/util/byacc/README b/util/byacc/README deleted file mode 100644 index 815f2da26..000000000 --- a/util/byacc/README +++ /dev/null @@ -1,23 +0,0 @@ - Berkeley Yacc is an LALR(1) parser generator. Berkeley Yacc has been made -as compatible as possible with AT&T Yacc. Berkeley Yacc can accept any input -specification that conforms to the AT&T Yacc documentation. Specifications -that take advantage of undocumented features of AT&T Yacc will probably be -rejected. - - Berkeley Yacc is distributed with no warranty whatever. The code is certain -to contain errors. Neither the author nor any contributor takes responsibility -for any consequences of its use. - - Berkeley Yacc is in the public domain. The data structures and algorithms -used in Berkeley Yacc are all either taken from documents available to the -general public or are inventions of the author. Anyone may freely distribute -source or binary forms of Berkeley Yacc whether unchanged or modified. -Distributers may charge whatever fees they can obtain for Berkeley Yacc. -Programs generated by Berkeley Yacc may be distributed freely. - - Please report bugs to - - corbett@berkeley.edu - -Include a small example if possible. Please include the banner string from -skeleton.c with the bug report. Do not expect rapid responses. diff --git a/util/byacc/closure.c b/util/byacc/closure.c deleted file mode 100644 index c69457c5d..000000000 --- a/util/byacc/closure.c +++ /dev/null @@ -1,265 +0,0 @@ -#include "defs.h" - -short *itemset; -short *itemsetend; -unsigned *ruleset; - -static unsigned *first_derives; -static unsigned *EFF; - - -set_EFF() -{ - register unsigned *row; - register int symbol; - register short *sp; - register int rowsize; - register int i; - register int rule; - - rowsize = WORDSIZE(nvars); - EFF = NEW2(nvars * rowsize, unsigned); - - row = EFF; - for (i = start_symbol; i < nsyms; i++) - { - sp = derives[i]; - for (rule = *sp; rule > 0; rule = *++sp) - { - symbol = ritem[rrhs[rule]]; - if (ISVAR(symbol)) - { - symbol -= start_symbol; - SETBIT(row, symbol); - } - } - row += rowsize; - } - - reflexive_transitive_closure(EFF, nvars); - -#ifdef DEBUG - print_EFF(); -#endif -} - - -set_first_derives() -{ - register unsigned *rrow; - register unsigned *vrow; - register int j; - register unsigned mask; - register unsigned cword; - register short *rp; - - int rule; - int i; - int rulesetsize; - int varsetsize; - - rulesetsize = WORDSIZE(nrules); - varsetsize = WORDSIZE(nvars); - first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize; - - set_EFF(); - - rrow = first_derives + ntokens * rulesetsize; - for (i = start_symbol; i < nsyms; i++) - { - vrow = EFF + ((i - ntokens) * varsetsize); - cword = *vrow++; - mask = 1; - for (j = start_symbol; j < nsyms; j++) - { - if (cword & mask) - { - rp = derives[j]; - while ((rule = *rp++) >= 0) - { - SETBIT(rrow, rule); - } - } - - mask <<= 1; - if (mask == 0) - { - cword = *vrow++; - mask = 1; - } - } - - vrow += varsetsize; - rrow += rulesetsize; - } - -#ifdef DEBUG - print_first_derives(); -#endif - - FREE(EFF); -} - - -closure(nucleus, n) -short *nucleus; -int n; -{ - register int ruleno; - register unsigned word; - register unsigned mask; - register short *csp; - register unsigned *dsp; - register unsigned *rsp; - register int rulesetsize; - - short *csend; - unsigned *rsend; - int symbol; - int itemno; - - rulesetsize = WORDSIZE(nrules); - rsp = ruleset; - rsend = ruleset + rulesetsize; - for (rsp = ruleset; rsp < rsend; rsp++) - *rsp = 0; - - csend = nucleus + n; - for (csp = nucleus; csp < csend; ++csp) - { - symbol = ritem[*csp]; - if (ISVAR(symbol)) - { - dsp = first_derives + symbol * rulesetsize; - rsp = ruleset; - while (rsp < rsend) - *rsp++ |= *dsp++; - } - } - - ruleno = 0; - itemsetend = itemset; - csp = nucleus; - for (rsp = ruleset; rsp < rsend; ++rsp) - { - word = *rsp; - if (word == 0) - ruleno += BITS_PER_WORD; - else - { - mask = 1; - while (mask) - { - if (word & mask) - { - itemno = rrhs[ruleno]; - while (csp < csend && *csp < itemno) - *itemsetend++ = *csp++; - *itemsetend++ = itemno; - while (csp < csend && *csp == itemno) - ++csp; - } - - mask <<= 1; - ++ruleno; - } - } - } - - while (csp < csend) - *itemsetend++ = *csp++; - -#ifdef DEBUG - print_closure(n); -#endif -} - - - -finalize_closure() -{ - FREE(itemset); - FREE(ruleset); - FREE(first_derives + ntokens * WORDSIZE(nrules)); -} - - -#ifdef DEBUG - -print_closure(n) -int n; -{ - register short *isp; - - printf("\n\nn = %d\n\n", n); - for (isp = itemset; isp < itemsetend; isp++) - printf(" %d\n", *isp); -} - - -print_EFF() -{ - register int i, j, k; - register unsigned *rowp; - register unsigned word; - register unsigned mask; - - printf("\n\nEpsilon Free Firsts\n"); - - for (i = start_symbol; i < nsyms; i++) - { - printf("\n%s", symbol_name[i]); - rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars)); - word = *rowp++; - - mask = 1; - for (j = 0; j < nvars; j++) - { - if (word & mask) - printf(" %s", symbol_name[start_symbol + j]); - - mask <<= 1; - if (mask == 0) - { - word = *rowp++; - mask = 1; - } - } - } -} - - -print_first_derives() -{ - register int i; - register int j; - register unsigned *rp; - register unsigned cword; - register unsigned mask; - - printf("\n\n\nFirst Derives\n"); - - for (i = start_symbol; i < nsyms; i++) - { - printf("\n%s derives\n", symbol_name[i]); - rp = first_derives + i * WORDSIZE(nrules); - cword = *rp++; - mask = 1; - for (j = 0; j <= nrules; j++) - { - if (cword & mask) - printf(" %d\n", j); - - mask <<= 1; - if (mask == 0) - { - cword = *rp++; - mask = 1; - } - } - } - - fflush(stdout); -} - -#endif diff --git a/util/byacc/defs.h b/util/byacc/defs.h deleted file mode 100644 index 8be3d80db..000000000 --- a/util/byacc/defs.h +++ /dev/null @@ -1,273 +0,0 @@ -#include -#include -#include -#include -#include - -/* machine dependent definitions */ -/* the following definitions are for the VAX */ -/* they might have to be changed for other machines */ - -/* MAXCHAR is the largest unsigned character value */ -/* MAXSHORT is the largest value of a C short */ -/* MAXTABLE is the maximum table size */ -/* BITS_PER_WORD is the number of bits in a C unsigned */ -/* WORDSIZE computes the number of words needed to */ -/* store n bits */ -/* BIT returns the value of the n-th bit starting */ -/* from r (0-indexed) */ -/* SETBIT sets the n-th bit starting from r */ - -#define MAXCHAR 255 -#define MAXSHORT 32767 -#define MAXTABLE 32500 -#define BITS_PER_WORD ((int)sizeof(int)<<3) -#define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD) -#define BIT(r, n) ((((r)[(n)/BITS_PER_WORD]) >> ((n) & (BITS_PER_WORD-1))) & 1) -#define SETBIT(r, n) ((r)[(n)/BITS_PER_WORD] |= (1 << ((n) & (BITS_PER_WORD-1)))) - - -/* character names */ - -#define NUL '\0' /* the null character */ -#define NEWLINE '\n' /* line feed */ -#define SP ' ' /* space */ -#define BS '\b' /* backspace */ -#define HT '\t' /* horizontal tab */ -#define VT '\013' /* vertical tab */ -#define CR '\r' /* carriage return */ -#define FF '\f' /* form feed */ -#define QUOTE '\'' /* single quote */ -#define DOUBLE_QUOTE '\"' /* double quote */ -#define BACKSLASH '\\' /* backslash */ - - -/* defines for constructing filenames */ - -#define CODE_SUFFIX ".code.c" -#define DEFINES_SUFFIX ".tab.h" -#define OUTPUT_SUFFIX ".tab.c" -#define VERBOSE_SUFFIX ".output" - - -/* keyword codes */ - -#define TOKEN 0 -#define LEFT 1 -#define RIGHT 2 -#define NONASSOC 3 -#define MARK 4 -#define TEXT 5 -#define TYPE 6 -#define START 7 -#define UNION 8 -#define IDENT 9 - - -/* symbol classes */ - -#define UNKNOWN 0 -#define TERM 1 -#define NONTERM 2 - - -/* the undefined value */ - -#define UNDEFINED (-1) - - -/* action codes */ - -#define SHIFT 1 -#define REDUCE 2 - - -/* character macros */ - -#define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$') -#define IS_OCTAL(c) ((c) >= '0' && (c) <= '7') -#define NUMERIC_VALUE(c) ((c) - '0') - - -/* symbol macros */ - -#define ISTOKEN(s) ((s) < start_symbol) -#define ISVAR(s) ((s) >= start_symbol) - - -/* storage allocation macros */ - -#define CALLOC(k,n) (calloc((unsigned)(k),(unsigned)(n))) -#define FREE(x) (free((char*)(x))) -#define MALLOC(n) (malloc((unsigned)(n))) -#define NEW(t) ((t*)allocate(sizeof(t))) -#define NEW2(n,t) ((t*)allocate((unsigned)((n)*sizeof(t)))) -#define REALLOC(p,n) (realloc((char*)(p),(unsigned)(n))) - - -/* the structure of a symbol table entry */ - -typedef struct bucket bucket; -struct bucket -{ - struct bucket *link; - struct bucket *next; - char *name; - char *tag; - short value; - short index; - short prec; - char class; - char assoc; -}; - - -/* the structure of the LR(0) state machine */ - -typedef struct core core; -struct core -{ - struct core *next; - struct core *link; - short number; - short accessing_symbol; - short nitems; - short items[1]; -}; - - -/* the structure used to record shifts */ - -typedef struct shifts shifts; -struct shifts -{ - struct shifts *next; - short number; - short nshifts; - short shift[1]; -}; - - -/* the structure used to store reductions */ - -typedef struct reductions reductions; -struct reductions -{ - struct reductions *next; - short number; - short nreds; - short rules[1]; -}; - - -/* the structure used to represent parser actions */ - -typedef struct action action; -struct action -{ - struct action *next; - short symbol; - short number; - short prec; - char action_code; - char assoc; - char suppressed; -}; - - -/* global variables */ - -extern char dflag; -extern char lflag; -extern char rflag; -extern char tflag; -extern char vflag; - -extern char *myname; -extern char *cptr; -extern char *line; -extern int lineno; -extern int outline; - -extern char *banner[]; -extern char *tables[]; -extern char *header[]; -extern char *body[]; -extern char *trailer[]; - -extern char *action_file_name; -extern char *code_file_name; -extern char *defines_file_name; -extern char *input_file_name; -extern char *output_file_name; -extern char *text_file_name; -extern char *union_file_name; -extern char *verbose_file_name; - -extern FILE *action_file; -extern FILE *code_file; -extern FILE *defines_file; -extern FILE *input_file; -extern FILE *output_file; -extern FILE *text_file; -extern FILE *union_file; -extern FILE *verbose_file; - -extern int nitems; -extern int nrules; -extern int nsyms; -extern int ntokens; -extern int nvars; -extern int ntags; - -extern char unionized; -extern char line_format[]; - -extern int start_symbol; -extern char **symbol_name; -extern short *symbol_value; -extern short *symbol_prec; -extern char *symbol_assoc; - -extern short *ritem; -extern short *rlhs; -extern short *rrhs; -extern short *rprec; -extern char *rassoc; - -extern short **derives; -extern char *nullable; - -extern bucket *first_symbol; -extern bucket *last_symbol; - -extern int nstates; -extern core *first_state; -extern shifts *first_shift; -extern reductions *first_reduction; -extern short *accessing_symbol; -extern core **state_table; -extern shifts **shift_table; -extern reductions **reduction_table; -extern unsigned *LA; -extern short *LAruleno; -extern short *lookaheads; -extern short *goto_map; -extern short *from_state; -extern short *to_state; - -extern action **parser; -extern int SRtotal; -extern int RRtotal; -extern short *SRconflicts; -extern short *RRconflicts; -extern short *defred; -extern short *rules_used; -extern short nunused; -extern short final_state; - -/* global functions */ - -extern char *allocate(); -extern bucket *lookup(); -extern bucket *make_bucket(); diff --git a/util/byacc/error.c b/util/byacc/error.c deleted file mode 100644 index 3ed564c62..000000000 --- a/util/byacc/error.c +++ /dev/null @@ -1,317 +0,0 @@ -/* routines for printing error messages */ - -#include "defs.h" - - -fatal(msg) -char *msg; -{ - fprintf(stderr, "%s: f - %s\n", myname, msg); - done(2); -} - - -no_space() -{ - fprintf(stderr, "%s: f - out of space\n", myname); - done(2); -} - - -open_error(filename) -char *filename; -{ - fprintf(stderr, "%s: f - cannot open \"%s\"\n", myname, filename); - done(2); -} - - -unexpected_EOF() -{ - fprintf(stderr, "%s: e - line %d of \"%s\", unexpected end-of-file\n", - myname, lineno, input_file_name); - done(1); -} - - -print_pos(st_line, st_cptr) -char *st_line; -char *st_cptr; -{ - register char *s; - - if (st_line == 0) return; - for (s = st_line; *s != '\n'; ++s) - { - if (isprint(*s) || *s == '\t') - putc(*s, stderr); - else - putc('?', stderr); - } - putc('\n', stderr); - for (s = st_line; s < st_cptr; ++s) - { - if (*s == '\t') - putc('\t', stderr); - else - putc(' ', stderr); - } - putc('^', stderr); - putc('\n', stderr); -} - - -syntax_error(st_lineno, st_line, st_cptr) -int st_lineno; -char *st_line; -char *st_cptr; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", syntax error\n", - myname, st_lineno, input_file_name); - print_pos(st_line, st_cptr); - done(1); -} - - -unterminated_comment(c_lineno, c_line, c_cptr) -int c_lineno; -char *c_line; -char *c_cptr; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", unmatched /*\n", - myname, c_lineno, input_file_name); - print_pos(c_line, c_cptr); - done(1); -} - - -unterminated_string(s_lineno, s_line, s_cptr) -int s_lineno; -char *s_line; -char *s_cptr; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", unterminated string\n", - myname, s_lineno, input_file_name); - print_pos(s_line, s_cptr); - done(1); -} - - -unterminated_text(t_lineno, t_line, t_cptr) -int t_lineno; -char *t_line; -char *t_cptr; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", unmatched %%{\n", - myname, t_lineno, input_file_name); - print_pos(t_line, t_cptr); - done(1); -} - - -unterminated_union(u_lineno, u_line, u_cptr) -int u_lineno; -char *u_line; -char *u_cptr; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", unterminated %%union \ -declaration\n", myname, u_lineno, input_file_name); - print_pos(u_line, u_cptr); - done(1); -} - - -over_unionized(u_cptr) -char *u_cptr; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", too many %%union \ -declarations\n", myname, lineno, input_file_name); - print_pos(line, u_cptr); - done(1); -} - - -illegal_tag(t_lineno, t_line, t_cptr) -int t_lineno; -char *t_line; -char *t_cptr; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", illegal tag\n", - myname, t_lineno, input_file_name); - print_pos(t_line, t_cptr); - done(1); -} - - -illegal_character(c_cptr) -char *c_cptr; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", illegal character\n", - myname, lineno, input_file_name); - print_pos(line, c_cptr); - done(1); -} - - -used_reserved(s) -char *s; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", illegal use of reserved symbol \ -%s\n", myname, lineno, input_file_name, s); - done(1); -} - - -tokenized_start(s) -char *s; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", the start symbol %s cannot be \ -declared to be a token\n", myname, lineno, input_file_name, s); - done(1); -} - - -retyped_warning(s) -char *s; -{ - fprintf(stderr, "%s: w - line %d of \"%s\", the type of %s has been \ -redeclared\n", myname, lineno, input_file_name, s); -} - - -reprec_warning(s) -char *s; -{ - fprintf(stderr, "%s: w - line %d of \"%s\", the precedence of %s has been \ -redeclared\n", myname, lineno, input_file_name, s); -} - - -revalued_warning(s) -char *s; -{ - fprintf(stderr, "%s: w - line %d of \"%s\", the value of %s has been \ -redeclared\n", myname, lineno, input_file_name, s); -} - - -terminal_start(s) -char *s; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", the start symbol %s is a \ -token\n", myname, lineno, input_file_name, s); - done(1); -} - - -restarted_warning() -{ - fprintf(stderr, "%s: w - line %d of \"%s\", the start symbol has been \ -redeclared\n", myname, lineno, input_file_name); -} - - -no_grammar() -{ - fprintf(stderr, "%s: e - line %d of \"%s\", no grammar has been \ -specified\n", myname, lineno, input_file_name); - done(1); -} - - -terminal_lhs(s_lineno) -int s_lineno; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", a token appears on the lhs \ -of a production\n", myname, s_lineno, input_file_name); - done(1); -} - - -prec_redeclared() -{ - fprintf(stderr, "%s: w - line %d of \"%s\", conflicting %%prec \ -specifiers\n", myname, lineno, input_file_name); -} - - -unterminated_action(a_lineno, a_line, a_cptr) -int a_lineno; -char *a_line; -char *a_cptr; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", unterminated action\n", - myname, a_lineno, input_file_name); - print_pos(a_line, a_cptr); - done(1); -} - - -dollar_warning(a_lineno, i) -int a_lineno; -int i; -{ - fprintf(stderr, "%s: w - line %d of \"%s\", $%d references beyond the \ -end of the current rule\n", myname, a_lineno, input_file_name, i); -} - - -dollar_error(a_lineno, a_line, a_cptr) -int a_lineno; -char *a_line; -char *a_cptr; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", illegal $-name\n", - myname, a_lineno, input_file_name); - print_pos(a_line, a_cptr); - done(1); -} - - -untyped_lhs() -{ - fprintf(stderr, "%s: e - line %d of \"%s\", $$ is untyped\n", - myname, lineno, input_file_name); - done(1); -} - - -untyped_rhs(i, s) -int i; -char *s; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", $%d (%s) is untyped\n", - myname, lineno, input_file_name, i, s); - done(1); -} - - -unknown_rhs(i) -int i; -{ - fprintf(stderr, "%s: e - line %d of \"%s\", $%d is untyped\n", - myname, lineno, input_file_name, i); - done(1); -} - - -default_action_warning() -{ - fprintf(stderr, "%s: w - line %d of \"%s\", the default action assigns an \ -undefined value to $$\n", myname, lineno, input_file_name); -} - - -undefined_goal(s) -char *s; -{ - fprintf(stderr, "%s: e - the start symbol %s is undefined\n", myname, s); - done(1); -} - - -undefined_symbol_warning(s) -char *s; -{ - fprintf(stderr, "%s: w - the symbol %s is undefined\n", myname, s); -} diff --git a/util/byacc/lalr.c b/util/byacc/lalr.c deleted file mode 100644 index 640ddc4ca..000000000 --- a/util/byacc/lalr.c +++ /dev/null @@ -1,638 +0,0 @@ -#include "defs.h" - -typedef - struct shorts - { - struct shorts *next; - short value; - } - shorts; - -int tokensetsize; -short *lookaheads; -short *LAruleno; -unsigned *LA; -short *accessing_symbol; -core **state_table; -shifts **shift_table; -reductions **reduction_table; -short *goto_map; -short *from_state; -short *to_state; - -short **transpose(); - -static int infinity; -static int maxrhs; -static int ngotos; -static unsigned *F; -static short **includes; -static shorts **lookback; -static short **R; -static short *INDEX; -static short *VERTICES; -static int top; - - -lalr() -{ - tokensetsize = WORDSIZE(ntokens); - - set_state_table(); - set_accessing_symbol(); - set_shift_table(); - set_reduction_table(); - set_maxrhs(); - initialize_LA(); - set_goto_map(); - initialize_F(); - build_relations(); - compute_FOLLOWS(); - compute_lookaheads(); -} - - - -set_state_table() -{ - register core *sp; - - state_table = NEW2(nstates, core *); - for (sp = first_state; sp; sp = sp->next) - state_table[sp->number] = sp; -} - - - -set_accessing_symbol() -{ - register core *sp; - - accessing_symbol = NEW2(nstates, short); - for (sp = first_state; sp; sp = sp->next) - accessing_symbol[sp->number] = sp->accessing_symbol; -} - - - -set_shift_table() -{ - register shifts *sp; - - shift_table = NEW2(nstates, shifts *); - for (sp = first_shift; sp; sp = sp->next) - shift_table[sp->number] = sp; -} - - - -set_reduction_table() -{ - register reductions *rp; - - reduction_table = NEW2(nstates, reductions *); - for (rp = first_reduction; rp; rp = rp->next) - reduction_table[rp->number] = rp; -} - - - -set_maxrhs() -{ - register short *itemp; - register short *item_end; - register int length; - register int max; - - length = 0; - max = 0; - item_end = ritem + nitems; - for (itemp = ritem; itemp < item_end; itemp++) - { - if (*itemp >= 0) - { - length++; - } - else - { - if (length > max) max = length; - length = 0; - } - } - - maxrhs = max; -} - - - -initialize_LA() -{ - register int i, j, k; - register reductions *rp; - - lookaheads = NEW2(nstates + 1, short); - - k = 0; - for (i = 0; i < nstates; i++) - { - lookaheads[i] = k; - rp = reduction_table[i]; - if (rp) - k += rp->nreds; - } - lookaheads[nstates] = k; - - LA = NEW2(k * tokensetsize, unsigned); - LAruleno = NEW2(k, short); - lookback = NEW2(k, shorts *); - - k = 0; - for (i = 0; i < nstates; i++) - { - rp = reduction_table[i]; - if (rp) - { - for (j = 0; j < rp->nreds; j++) - { - LAruleno[k] = rp->rules[j]; - k++; - } - } - } -} - - -set_goto_map() -{ - register shifts *sp; - register int i; - register int symbol; - register int k; - register short *temp_map; - register int state2; - register int state1; - - goto_map = NEW2(nvars + 1, short) - ntokens; - temp_map = NEW2(nvars + 1, short) - ntokens; - - ngotos = 0; - for (sp = first_shift; sp; sp = sp->next) - { - for (i = sp->nshifts - 1; i >= 0; i--) - { - symbol = accessing_symbol[sp->shift[i]]; - - if (ISTOKEN(symbol)) break; - - if (ngotos == MAXSHORT) - fatal("too many gotos"); - - ngotos++; - goto_map[symbol]++; - } - } - - k = 0; - for (i = ntokens; i < nsyms; i++) - { - temp_map[i] = k; - k += goto_map[i]; - } - - for (i = ntokens; i < nsyms; i++) - goto_map[i] = temp_map[i]; - - goto_map[nsyms] = ngotos; - temp_map[nsyms] = ngotos; - - from_state = NEW2(ngotos, short); - to_state = NEW2(ngotos, short); - - for (sp = first_shift; sp; sp = sp->next) - { - state1 = sp->number; - for (i = sp->nshifts - 1; i >= 0; i--) - { - state2 = sp->shift[i]; - symbol = accessing_symbol[state2]; - - if (ISTOKEN(symbol)) break; - - k = temp_map[symbol]++; - from_state[k] = state1; - to_state[k] = state2; - } - } - - FREE(temp_map + ntokens); -} - - - -/* Map_goto maps a state/symbol pair into its numeric representation. */ - -int -map_goto(state, symbol) -int state; -int symbol; -{ - register int high; - register int low; - register int middle; - register int s; - - low = goto_map[symbol]; - high = goto_map[symbol + 1]; - - for (;;) - { - assert(low <= high); - middle = (low + high) >> 1; - s = from_state[middle]; - if (s == state) - return (middle); - else if (s < state) - low = middle + 1; - else - high = middle - 1; - } -} - - - -initialize_F() -{ - register int i; - register int j; - register int k; - register shifts *sp; - register short *edge; - register unsigned *rowp; - register short *rp; - register short **reads; - register int nedges; - register int stateno; - register int symbol; - register int nwords; - - nwords = ngotos * tokensetsize; - F = NEW2(nwords, unsigned); - - reads = NEW2(ngotos, short *); - edge = NEW2(ngotos + 1, short); - nedges = 0; - - rowp = F; - for (i = 0; i < ngotos; i++) - { - stateno = to_state[i]; - sp = shift_table[stateno]; - - if (sp) - { - k = sp->nshifts; - - for (j = 0; j < k; j++) - { - symbol = accessing_symbol[sp->shift[j]]; - if (ISVAR(symbol)) - break; - SETBIT(rowp, symbol); - } - - for (; j < k; j++) - { - symbol = accessing_symbol[sp->shift[j]]; - if (nullable[symbol]) - edge[nedges++] = map_goto(stateno, symbol); - } - - if (nedges) - { - reads[i] = rp = NEW2(nedges + 1, short); - - for (j = 0; j < nedges; j++) - rp[j] = edge[j]; - - rp[nedges] = -1; - nedges = 0; - } - } - - rowp += tokensetsize; - } - - SETBIT(F, 0); - digraph(reads); - - for (i = 0; i < ngotos; i++) - { - if (reads[i]) - FREE(reads[i]); - } - - FREE(reads); - FREE(edge); -} - - - -build_relations() -{ - register int i; - register int j; - register int k; - register short *rulep; - register short *rp; - register shifts *sp; - register int length; - register int nedges; - register int done; - register int state1; - register int stateno; - register int symbol1; - register int symbol2; - register short *shortp; - register short *edge; - register short *states; - register short **new_includes; - - includes = NEW2(ngotos, short *); - edge = NEW2(ngotos + 1, short); - states = NEW2(maxrhs + 1, short); - - for (i = 0; i < ngotos; i++) - { - nedges = 0; - state1 = from_state[i]; - symbol1 = accessing_symbol[to_state[i]]; - - for (rulep = derives[symbol1]; *rulep >= 0; rulep++) - { - length = 1; - states[0] = state1; - stateno = state1; - - for (rp = ritem + rrhs[*rulep]; *rp >= 0; rp++) - { - symbol2 = *rp; - sp = shift_table[stateno]; - k = sp->nshifts; - - for (j = 0; j < k; j++) - { - stateno = sp->shift[j]; - if (accessing_symbol[stateno] == symbol2) break; - } - - states[length++] = stateno; - } - - add_lookback_edge(stateno, *rulep, i); - - length--; - done = 0; - while (!done) - { - done = 1; - rp--; - if (ISVAR(*rp)) - { - stateno = states[--length]; - edge[nedges++] = map_goto(stateno, *rp); - if (nullable[*rp] && length > 0) done = 0; - } - } - } - - if (nedges) - { - includes[i] = shortp = NEW2(nedges + 1, short); - for (j = 0; j < nedges; j++) - shortp[j] = edge[j]; - shortp[nedges] = -1; - } - } - - new_includes = transpose(includes, ngotos); - - for (i = 0; i < ngotos; i++) - if (includes[i]) - FREE(includes[i]); - - FREE(includes); - - includes = new_includes; - - FREE(edge); - FREE(states); -} - - -add_lookback_edge(stateno, ruleno, gotono) -int stateno, ruleno, gotono; -{ - register int i, k; - register int found; - register shorts *sp; - - i = lookaheads[stateno]; - k = lookaheads[stateno + 1]; - found = 0; - while (!found && i < k) - { - if (LAruleno[i] == ruleno) - found = 1; - else - ++i; - } - assert(found); - - sp = NEW(shorts); - sp->next = lookback[i]; - sp->value = gotono; - lookback[i] = sp; -} - - - -short ** -transpose(R, n) -short **R; -int n; -{ - register short **new_R; - register short **temp_R; - register short *nedges; - register short *sp; - register int i; - register int k; - - nedges = NEW2(n, short); - - for (i = 0; i < n; i++) - { - sp = R[i]; - if (sp) - { - while (*sp >= 0) - nedges[*sp++]++; - } - } - - new_R = NEW2(n, short *); - temp_R = NEW2(n, short *); - - for (i = 0; i < n; i++) - { - k = nedges[i]; - if (k > 0) - { - sp = NEW2(k + 1, short); - new_R[i] = sp; - temp_R[i] = sp; - sp[k] = -1; - } - } - - FREE(nedges); - - for (i = 0; i < n; i++) - { - sp = R[i]; - if (sp) - { - while (*sp >= 0) - *temp_R[*sp++]++ = i; - } - } - - FREE(temp_R); - - return (new_R); -} - - - -compute_FOLLOWS() -{ - digraph(includes); -} - - -compute_lookaheads() -{ - register int i, n; - register unsigned *fp1, *fp2, *fp3; - register shorts *sp, *next; - register unsigned *rowp; - - rowp = LA; - n = lookaheads[nstates]; - for (i = 0; i < n; i++) - { - fp3 = rowp + tokensetsize; - for (sp = lookback[i]; sp; sp = sp->next) - { - fp1 = rowp; - fp2 = F + tokensetsize * sp->value; - while (fp1 < fp3) - *fp1++ |= *fp2++; - } - rowp = fp3; - } - - for (i = 0; i < n; i++) - for (sp = lookback[i]; sp; sp = next) - { - next = sp->next; - FREE(sp); - } - - FREE(lookback); - FREE(F); -} - - -digraph(relation) -short **relation; -{ - register int i; - - infinity = ngotos + 2; - INDEX = NEW2(ngotos + 1, short); - VERTICES = NEW2(ngotos + 1, short); - top = 0; - - R = relation; - - for (i = 0; i < ngotos; i++) - INDEX[i] = 0; - - for (i = 0; i < ngotos; i++) - { - if (INDEX[i] == 0 && R[i]) - traverse(i); - } - - FREE(INDEX); - FREE(VERTICES); -} - - - -traverse(i) -register int i; -{ - register unsigned *fp1; - register unsigned *fp2; - register unsigned *fp3; - register int j; - register short *rp; - - int height; - unsigned *base; - - VERTICES[++top] = i; - INDEX[i] = height = top; - - base = F + i * tokensetsize; - fp3 = base + tokensetsize; - - rp = R[i]; - if (rp) - { - while ((j = *rp++) >= 0) - { - if (INDEX[j] == 0) - traverse(j); - - if (INDEX[i] > INDEX[j]) - INDEX[i] = INDEX[j]; - - fp1 = base; - fp2 = F + j * tokensetsize; - - while (fp1 < fp3) - *fp1++ |= *fp2++; - } - } - - if (INDEX[i] == height) - { - for (;;) - { - j = VERTICES[top--]; - INDEX[j] = infinity; - - if (i == j) - break; - - fp1 = base; - fp2 = F + j * tokensetsize; - - while (fp1 < fp3) - *fp2++ = *fp1++; - } - } -} diff --git a/util/byacc/lr0.c b/util/byacc/lr0.c deleted file mode 100644 index 3ee42a884..000000000 --- a/util/byacc/lr0.c +++ /dev/null @@ -1,598 +0,0 @@ - -#include "defs.h" - -extern short *itemset; -extern short *itemsetend; -extern unsigned *ruleset; - -int nstates; -core *first_state; -shifts *first_shift; -reductions *first_reduction; - -int get_state(); -core *new_state(); - -static core **state_set; -static core *this_state; -static core *last_state; -static shifts *last_shift; -static reductions *last_reduction; - -static int nshifts; -static short *shift_symbol; - -static short *redset; -static short *shiftset; - -static short **kernel_base; -static short **kernel_end; -static short *kernel_items; - - -allocate_itemsets() -{ - register short *itemp; - register short *item_end; - register int symbol; - register int i; - register int count; - register int max; - register short *symbol_count; - - count = 0; - symbol_count = NEW2(nsyms, short); - - item_end = ritem + nitems; - for (itemp = ritem; itemp < item_end; itemp++) - { - symbol = *itemp; - if (symbol >= 0) - { - count++; - symbol_count[symbol]++; - } - } - - kernel_base = NEW2(nsyms, short *); - kernel_items = NEW2(count, short); - - count = 0; - max = 0; - for (i = 0; i < nsyms; i++) - { - kernel_base[i] = kernel_items + count; - count += symbol_count[i]; - if (max < symbol_count[i]) - max = symbol_count[i]; - } - - shift_symbol = symbol_count; - kernel_end = NEW2(nsyms, short *); -} - - -allocate_storage() -{ - allocate_itemsets(); - shiftset = NEW2(nsyms, short); - redset = NEW2(nrules + 1, short); - state_set = NEW2(nitems, core *); -} - - -append_states() -{ - register int i; - register int j; - register int symbol; - -#ifdef TRACE - fprintf(stderr, "Entering append_states()\n"); -#endif - for (i = 1; i < nshifts; i++) - { - symbol = shift_symbol[i]; - j = i; - while (j > 0 && shift_symbol[j - 1] > symbol) - { - shift_symbol[j] = shift_symbol[j - 1]; - j--; - } - shift_symbol[j] = symbol; - } - - for (i = 0; i < nshifts; i++) - { - symbol = shift_symbol[i]; - shiftset[i] = get_state(symbol); - } -} - - -free_storage() -{ - FREE(shift_symbol); - FREE(redset); - FREE(shiftset); - FREE(kernel_base); - FREE(kernel_end); - FREE(kernel_items); - FREE(state_set); -} - - - -generate_states() -{ - allocate_storage(); - itemset = NEW2(nitems, short); - ruleset = NEW2(WORDSIZE(nrules), unsigned); - set_first_derives(); - initialize_states(); - - while (this_state) - { - closure(this_state->items, this_state->nitems); - save_reductions(); - new_itemsets(); - append_states(); - - if (nshifts > 0) - save_shifts(); - - this_state = this_state->next; - } - - finalize_closure(); - free_storage(); -} - - - -int -get_state(symbol) -int symbol; -{ - register int key; - register short *isp1; - register short *isp2; - register short *iend; - register core *sp; - register int found; - register int n; - -#ifdef TRACE - fprintf(stderr, "Entering get_state(%d)\n", symbol); -#endif - - isp1 = kernel_base[symbol]; - iend = kernel_end[symbol]; - n = iend - isp1; - - key = *isp1; - assert(0 <= key && key < nitems); - sp = state_set[key]; - if (sp) - { - found = 0; - while (!found) - { - if (sp->nitems == n) - { - found = 1; - isp1 = kernel_base[symbol]; - isp2 = sp->items; - - while (found && isp1 < iend) - { - if (*isp1++ != *isp2++) - found = 0; - } - } - - if (!found) - { - if (sp->link) - { - sp = sp->link; - } - else - { - sp = sp->link = new_state(symbol); - found = 1; - } - } - } - } - else - { - state_set[key] = sp = new_state(symbol); - } - - return (sp->number); -} - - - -initialize_states() -{ - register int i; - register short *start_derives; - register core *p; - - start_derives = derives[start_symbol]; - for (i = 0; start_derives[i] >= 0; ++i) - continue; - - p = (core *) MALLOC(sizeof(core) + i*sizeof(short)); - if (p == 0) no_space(); - - p->next = 0; - p->link = 0; - p->number = 0; - p->accessing_symbol = 0; - p->nitems = i; - - for (i = 0; start_derives[i] >= 0; ++i) - p->items[i] = rrhs[start_derives[i]]; - - first_state = last_state = this_state = p; - nstates = 1; -} - - -new_itemsets() -{ - register int i; - register int shiftcount; - register short *isp; - register short *ksp; - register int symbol; - - for (i = 0; i < nsyms; i++) - kernel_end[i] = 0; - - shiftcount = 0; - isp = itemset; - while (isp < itemsetend) - { - i = *isp++; - symbol = ritem[i]; - if (symbol > 0) - { - ksp = kernel_end[symbol]; - if (!ksp) - { - shift_symbol[shiftcount++] = symbol; - ksp = kernel_base[symbol]; - } - - *ksp++ = i + 1; - kernel_end[symbol] = ksp; - } - } - - nshifts = shiftcount; -} - - - -core * -new_state(symbol) -int symbol; -{ - register int n; - register core *p; - register short *isp1; - register short *isp2; - register short *iend; - -#ifdef TRACE - fprintf(stderr, "Entering new_state(%d)\n", symbol); -#endif - - if (nstates >= MAXSHORT) - fatal("too many states"); - - isp1 = kernel_base[symbol]; - iend = kernel_end[symbol]; - n = iend - isp1; - - p = (core *) allocate((unsigned) (sizeof(core) + (n - 1) * sizeof(short))); - p->accessing_symbol = symbol; - p->number = nstates; - p->nitems = n; - - isp2 = p->items; - while (isp1 < iend) - *isp2++ = *isp1++; - - last_state->next = p; - last_state = p; - - nstates++; - - return (p); -} - - -/* show_cores is used for debugging */ - -show_cores() -{ - core *p; - int i, j, k, n; - int itemno; - - k = 0; - for (p = first_state; p; ++k, p = p->next) - { - if (k) printf("\n"); - printf("state %d, number = %d, accessing symbol = %s\n", - k, p->number, symbol_name[p->accessing_symbol]); - n = p->nitems; - for (i = 0; i < n; ++i) - { - itemno = p->items[i]; - printf("%4d ", itemno); - j = itemno; - while (ritem[j] >= 0) ++j; - printf("%s :", symbol_name[rlhs[-ritem[j]]]); - j = rrhs[-ritem[j]]; - while (j < itemno) - printf(" %s", symbol_name[ritem[j++]]); - printf(" ."); - while (ritem[j] >= 0) - printf(" %s", symbol_name[ritem[j++]]); - printf("\n"); - fflush(stdout); - } - } -} - - -/* show_ritems is used for debugging */ - -show_ritems() -{ - int i; - - for (i = 0; i < nitems; ++i) - printf("ritem[%d] = %d\n", i, ritem[i]); -} - - -/* show_rrhs is used for debugging */ -show_rrhs() -{ - int i; - - for (i = 0; i < nrules; ++i) - printf("rrhs[%d] = %d\n", i, rrhs[i]); -} - - -/* show_shifts is used for debugging */ - -show_shifts() -{ - shifts *p; - int i, j, k; - - k = 0; - for (p = first_shift; p; ++k, p = p->next) - { - if (k) printf("\n"); - printf("shift %d, number = %d, nshifts = %d\n", k, p->number, - p->nshifts); - j = p->nshifts; - for (i = 0; i < j; ++i) - printf("\t%d\n", p->shift[i]); - } -} - - -save_shifts() -{ - register shifts *p; - register short *sp1; - register short *sp2; - register short *send; - - p = (shifts *) allocate((unsigned) (sizeof(shifts) + - (nshifts - 1) * sizeof(short))); - - p->number = this_state->number; - p->nshifts = nshifts; - - sp1 = shiftset; - sp2 = p->shift; - send = shiftset + nshifts; - - while (sp1 < send) - *sp2++ = *sp1++; - - if (last_shift) - { - last_shift->next = p; - last_shift = p; - } - else - { - first_shift = p; - last_shift = p; - } -} - - - -save_reductions() -{ - register short *isp; - register short *rp1; - register short *rp2; - register int item; - register int count; - register reductions *p; - register short *rend; - - count = 0; - for (isp = itemset; isp < itemsetend; isp++) - { - item = ritem[*isp]; - if (item < 0) - { - redset[count++] = -item; - } - } - - if (count) - { - p = (reductions *) allocate((unsigned) (sizeof(reductions) + - (count - 1) * sizeof(short))); - - p->number = this_state->number; - p->nreds = count; - - rp1 = redset; - rp2 = p->rules; - rend = rp1 + count; - - while (rp1 < rend) - *rp2++ = *rp1++; - - if (last_reduction) - { - last_reduction->next = p; - last_reduction = p; - } - else - { - first_reduction = p; - last_reduction = p; - } - } -} - - -set_derives() -{ - register int i, k; - register int lhs; - register short *rules; - - derives = NEW2(nsyms, short *); - rules = NEW2(nvars + nrules, short); - - k = 0; - for (lhs = start_symbol; lhs < nsyms; lhs++) - { - derives[lhs] = rules + k; - for (i = 0; i < nrules; i++) - { - if (rlhs[i] == lhs) - { - rules[k] = i; - k++; - } - } - rules[k] = -1; - k++; - } - -#ifdef DEBUG - print_derives(); -#endif -} - -free_derives() -{ - FREE(derives[start_symbol]); - FREE(derives); -} - -#ifdef DEBUG -print_derives() -{ - register int i; - register short *sp; - - printf("\nDERIVES\n\n"); - - for (i = start_symbol; i < nsyms; i++) - { - printf("%s derives ", symbol_name[i]); - for (sp = derives[i]; *sp >= 0; sp++) - { - printf(" %d", *sp); - } - putchar('\n'); - } - - putchar('\n'); -} -#endif - - -set_nullable() -{ - register int i, j; - register int empty; - int done; - - nullable = MALLOC(nsyms); - if (nullable == 0) no_space(); - - for (i = 0; i < nsyms; ++i) - nullable[i] = 0; - - done = 0; - while (!done) - { - done = 1; - for (i = 1; i < nitems; i++) - { - empty = 1; - while ((j = ritem[i]) >= 0) - { - if (!nullable[j]) - empty = 0; - ++i; - } - if (empty) - { - j = rlhs[-j]; - if (!nullable[j]) - { - nullable[j] = 1; - done = 0; - } - } - } - } - -#ifdef DEBUG - for (i = 0; i < nsyms; i++) - { - if (nullable[i]) - printf("%s is nullable\n", symbol_name[i]); - else - printf("%s is not nullable\n", symbol_name[i]); - } -#endif -} - - -free_nullable() -{ - FREE(nullable); -} - - -lr0() -{ - set_derives(); - set_nullable(); - generate_states(); -} diff --git a/util/byacc/main.c b/util/byacc/main.c deleted file mode 100644 index b7f5e8f0c..000000000 --- a/util/byacc/main.c +++ /dev/null @@ -1,363 +0,0 @@ -#include -#include -#include "defs.h" - -char dflag; -char lflag; -char rflag; -char tflag; -char vflag; - -char *file_prefix = "y"; -char *myname = "yacc"; -char *temp_form = "yacc.XXXXXXX"; - -int lineno; -int outline; - -char *action_file_name; -char *code_file_name; -char *defines_file_name; -char *input_file_name = ""; -char *output_file_name; -char *text_file_name; -char *union_file_name; -char *verbose_file_name; - -FILE *action_file; /* a temp file, used to save actions associated */ - /* with rules until the parser is written */ -FILE *code_file; /* y.code.c (used when the -r option is specified) */ -FILE *defines_file; /* y.tab.h */ -FILE *input_file; /* the input file */ -FILE *output_file; /* y.tab.c */ -FILE *text_file; /* a temp file, used to save text until all */ - /* symbols have been defined */ -FILE *union_file; /* a temp file, used to save the union */ - /* definition until all symbol have been */ - /* defined */ -FILE *verbose_file; /* y.output */ - -int nitems; -int nrules; -int nsyms; -int ntokens; -int nvars; - -int start_symbol; -char **symbol_name; -short *symbol_value; -short *symbol_prec; -char *symbol_assoc; - -short *ritem; -short *rlhs; -short *rrhs; -short *rprec; -char *rassoc; -short **derives; -char *nullable; - -done(k) -int k; -{ - if (action_file) { fclose(action_file); unlink(action_file_name); } - if (text_file) { fclose(text_file); unlink(text_file_name); } - if (union_file) { fclose(union_file); unlink(union_file_name); } - exit(k); -} - - -void -onintr() -{ - done(1); -} - - -set_signals() -{ -#ifdef SIGINT - if (signal(SIGINT, SIG_IGN) != SIG_IGN) - signal(SIGINT, onintr); -#endif -#ifdef SIGTERM - if (signal(SIGTERM, SIG_IGN) != SIG_IGN) - signal(SIGTERM, onintr); -#endif -#ifdef SIGHUP - if (signal(SIGHUP, SIG_IGN) != SIG_IGN) - signal(SIGHUP, onintr); -#endif -} - - -usage() -{ - fprintf(stderr, "usage: %s [-dlrtv] [-b file_prefix] filename\n", myname); - exit(1); -} - - -getargs(argc, argv) -int argc; -char *argv[]; -{ - register int i; - register char *s; - - if (argc > 0) myname = argv[0]; - for (i = 1; i < argc; ++i) - { - s = argv[i]; - if (*s != '-') break; - switch (*++s) - { - case '\0': - input_file = stdin; - if (i + 1 < argc) usage(); - return; - - case '-': - ++i; - goto no_more_options; - - case 'b': - if (*++s) - file_prefix = s; - else if (++i < argc) - file_prefix = argv[i]; - else - usage(); - continue; - - case 'd': - dflag = 1; - break; - - case 'l': - lflag = 1; - break; - - case 'r': - rflag = 1; - break; - - case 't': - tflag = 1; - break; - - case 'v': - vflag = 1; - break; - - default: - usage(); - } - - for (;;) - { - switch (*++s) - { - case '\0': - goto end_of_option; - - case 'd': - dflag = 1; - break; - - case 'l': - lflag = 1; - break; - - case 'r': - rflag = 1; - break; - - case 't': - tflag = 1; - break; - - case 'v': - vflag = 1; - break; - - default: - usage(); - } - } -end_of_option:; - } - -no_more_options:; - if (i + 1 != argc) usage(); - input_file_name = argv[i]; -} - - -char * -allocate(n) -unsigned n; -{ - register char *p; - - p = NULL; - if (n) - { - p = CALLOC(1, n); - if (!p) no_space(); - } - return (p); -} - - -create_file_names() -{ - int i, len; - char *tmpdir; - - tmpdir = getenv("TMPDIR"); - if (tmpdir == 0) tmpdir = "/tmp"; - - len = strlen(tmpdir); - i = len + 13; - if (len && tmpdir[len-1] != '/') - ++i; - - action_file_name = MALLOC(i); - if (action_file_name == 0) no_space(); - text_file_name = MALLOC(i); - if (text_file_name == 0) no_space(); - union_file_name = MALLOC(i); - if (union_file_name == 0) no_space(); - - strcpy(action_file_name, tmpdir); - strcpy(text_file_name, tmpdir); - strcpy(union_file_name, tmpdir); - - if (len && tmpdir[len - 1] != '/') - { - action_file_name[len] = '/'; - text_file_name[len] = '/'; - union_file_name[len] = '/'; - ++len; - } - - strcpy(action_file_name + len, temp_form); - strcpy(text_file_name + len, temp_form); - strcpy(union_file_name + len, temp_form); - - action_file_name[len + 5] = 'a'; - text_file_name[len + 5] = 't'; - union_file_name[len + 5] = 'u'; - - close(mkstemp(action_file_name)); - close(mkstemp(text_file_name)); - close(mkstemp(union_file_name)); - - len = strlen(file_prefix); - - output_file_name = MALLOC(len + 7); - if (output_file_name == 0) - no_space(); - strcpy(output_file_name, file_prefix); - strcpy(output_file_name + len, OUTPUT_SUFFIX); - - if (rflag) - { - code_file_name = MALLOC(len + 8); - if (code_file_name == 0) - no_space(); - strcpy(code_file_name, file_prefix); - strcpy(code_file_name + len, CODE_SUFFIX); - } - else - code_file_name = output_file_name; - - if (dflag) - { - defines_file_name = MALLOC(len + 7); - if (defines_file_name == 0) - no_space(); - strcpy(defines_file_name, file_prefix); - strcpy(defines_file_name + len, DEFINES_SUFFIX); - } - - if (vflag) - { - verbose_file_name = MALLOC(len + 8); - if (verbose_file_name == 0) - no_space(); - strcpy(verbose_file_name, file_prefix); - strcpy(verbose_file_name + len, VERBOSE_SUFFIX); - } -} - - -open_files() -{ - create_file_names(); - - if (input_file == 0) - { - input_file = fopen(input_file_name, "r"); - if (input_file == 0) - open_error(input_file_name); - } - - action_file = fopen(action_file_name, "w"); - if (action_file == 0) - open_error(action_file_name); - - text_file = fopen(text_file_name, "w"); - if (text_file == 0) - open_error(text_file_name); - - if (vflag) - { - verbose_file = fopen(verbose_file_name, "w"); - if (verbose_file == 0) - open_error(verbose_file_name); - } - - if (dflag) - { - defines_file = fopen(defines_file_name, "w"); - if (defines_file == 0) - open_error(defines_file_name); - union_file = fopen(union_file_name, "w"); - if (union_file == 0) - open_error(union_file_name); - } - - output_file = fopen(output_file_name, "w"); - if (output_file == 0) - open_error(output_file_name); - - if (rflag) - { - code_file = fopen(code_file_name, "w"); - if (code_file == 0) - open_error(code_file_name); - } - else - code_file = output_file; -} - - -int -main(argc, argv) -int argc; -char *argv[]; -{ - set_signals(); - getargs(argc, argv); - open_files(); - reader(); - lr0(); - lalr(); - make_parser(); - verbose(); - output(); - done(0); - /*NOTREACHED*/ -} diff --git a/util/byacc/manpage b/util/byacc/manpage deleted file mode 100644 index d815157a0..000000000 --- a/util/byacc/manpage +++ /dev/null @@ -1,100 +0,0 @@ -.\" %W% %R% (Berkeley) %E% -.\" -.TH YACC 1 "July\ 15,\ 1990" -.UC 6 -.SH NAME -Yacc \- an LALR(1) parser generator -.SH SYNOPSIS -.B yacc [ -dlrtv ] [ -b -.I prefix -.B ] -.I filename -.SH DESCRIPTION -.I Yacc -reads the grammar specification in the file -.I filename -and generates an LR(1) parser for it. -The parsers consist of a set of LALR(1) parsing tables and a driver routine -written in the C programming language. -.I Yacc -normally writes the parse tables and the driver routine to the file -.IR y.tab.c. -.PP -The following options are available: -.RS -.TP -\fB-b \fIprefix\fR -The -.B -b -option changes the prefix prepended to the output file names to -the string denoted by -.IR prefix. -The default prefix is the character -.IR y. -.TP -.B -d -The \fB-d\fR option causes the header file -.IR y.tab.h -to be written. -.TP -.B -l -If the -.B -l -option is not specified, -.I yacc -will insert \#line directives in the generated code. -The \#line directives let the C compiler relate errors in the -generated code to the user's original code. -If the \fB-l\fR option is specified, -.I yacc -will not insert the \#line directives. -\&\#line directives specified by the user will be retained. -.TP -.B -r -The -.B -r -option causes -.I yacc -to produce separate files for code and tables. The code file -is named -.IR y.code.c, -and the tables file is named -.IR y.tab.c. -.TP -.B -t -The -.B -t -option changes the preprocessor directives generated by -.I yacc -so that debugging statements will be incorporated in the compiled code. -.TP -.B -v -The -.B -v -option causes a human-readable description of the generated parser to -be written to the file -.IR y.output. -.RE -.PP -If the environment variable TMPDIR is set, the string denoted by -TMPDIR will be used as the name of the directory where the temporary -files are created. -.SH FILES -.IR y.code.c -.br -.IR y.tab.c -.br -.IR y.tab.h -.br -.IR y.output -.br -.IR /tmp/yacc.aXXXXXX -.br -.IR /tmp/yacc.tXXXXXX -.br -.IR /tmp/yacc.uXXXXXX -.SH DIAGNOSTICS -If there are rules that are never reduced, the number of such rules is -reported on standard error. -If there are any LALR(1) conflicts, the number of conflicts is reported -on standard error. diff --git a/util/byacc/mkpar.c b/util/byacc/mkpar.c deleted file mode 100644 index e1aef60fe..000000000 --- a/util/byacc/mkpar.c +++ /dev/null @@ -1,357 +0,0 @@ - -#include "defs.h" - -action **parser; -int SRtotal; -int RRtotal; -short *SRconflicts; -short *RRconflicts; -short *defred; -short *rules_used; -short nunused; -short final_state; - -static int SRcount; -static int RRcount; - -extern action *parse_actions(); -extern action *get_shifts(); -extern action *add_reductions(); -extern action *add_reduce(); - - -make_parser() -{ - register int i; - - parser = NEW2(nstates, action *); - for (i = 0; i < nstates; i++) - parser[i] = parse_actions(i); - - find_final_state(); - remove_conflicts(); - unused_rules(); - if (SRtotal + RRtotal > 0) total_conflicts(); - defreds(); -} - - -action * -parse_actions(stateno) -register int stateno; -{ - register action *actions; - - actions = get_shifts(stateno); - actions = add_reductions(stateno, actions); - return (actions); -} - - -action * -get_shifts(stateno) -int stateno; -{ - register action *actions, *temp; - register shifts *sp; - register short *to_state; - register int i, k; - register int symbol; - - actions = 0; - sp = shift_table[stateno]; - if (sp) - { - to_state = sp->shift; - for (i = sp->nshifts - 1; i >= 0; i--) - { - k = to_state[i]; - symbol = accessing_symbol[k]; - if (ISTOKEN(symbol)) - { - temp = NEW(action); - temp->next = actions; - temp->symbol = symbol; - temp->number = k; - temp->prec = symbol_prec[symbol]; - temp->action_code = SHIFT; - temp->assoc = symbol_assoc[symbol]; - actions = temp; - } - } - } - return (actions); -} - -action * -add_reductions(stateno, actions) -int stateno; -register action *actions; -{ - register int i, j, m, n; - register int ruleno, tokensetsize; - register unsigned *rowp; - - tokensetsize = WORDSIZE(ntokens); - m = lookaheads[stateno]; - n = lookaheads[stateno + 1]; - for (i = m; i < n; i++) - { - ruleno = LAruleno[i]; - rowp = LA + i * tokensetsize; - for (j = ntokens - 1; j >= 0; j--) - { - if (BIT(rowp, j)) - actions = add_reduce(actions, ruleno, j); - } - } - return (actions); -} - - -action * -add_reduce(actions, ruleno, symbol) -register action *actions; -register int ruleno, symbol; -{ - register action *temp, *prev, *next; - - prev = 0; - for (next = actions; next && next->symbol < symbol; next = next->next) - prev = next; - - while (next && next->symbol == symbol && next->action_code == SHIFT) - { - prev = next; - next = next->next; - } - - while (next && next->symbol == symbol && - next->action_code == REDUCE && next->number < ruleno) - { - prev = next; - next = next->next; - } - - temp = NEW(action); - temp->next = next; - temp->symbol = symbol; - temp->number = ruleno; - temp->prec = rprec[ruleno]; - temp->action_code = REDUCE; - temp->assoc = rassoc[ruleno]; - - if (prev) - prev->next = temp; - else - actions = temp; - - return (actions); -} - - -find_final_state() -{ - register int goal, i; - register short *to_state; - register shifts *p; - - p = shift_table[0]; - to_state = p->shift; - goal = ritem[1]; - for (i = p->nshifts - 1; i >= 0; --i) - { - final_state = to_state[i]; - if (accessing_symbol[final_state] == goal) break; - } -} - - -unused_rules() -{ - register int i; - register action *p; - - rules_used = (short *) MALLOC(nrules*sizeof(short)); - if (rules_used == 0) no_space(); - - for (i = 0; i < nrules; ++i) - rules_used[i] = 0; - - for (i = 0; i < nstates; ++i) - { - for (p = parser[i]; p; p = p->next) - { - if (p->action_code == REDUCE && p->suppressed == 0) - rules_used[p->number] = 1; - } - } - - nunused = 0; - for (i = 3; i < nrules; ++i) - if (!rules_used[i]) ++nunused; - - if (nunused) - if (nunused == 1) - fprintf(stderr, "%s: 1 rule never reduced\n", myname); - else - fprintf(stderr, "%s: %d rules never reduced\n", myname, nunused); -} - - -remove_conflicts() -{ - register int i; - register int symbol; - register action *p, *pref; - - SRtotal = 0; - RRtotal = 0; - SRconflicts = NEW2(nstates, short); - RRconflicts = NEW2(nstates, short); - for (i = 0; i < nstates; i++) - { - SRcount = 0; - RRcount = 0; - symbol = -1; - for (p = parser[i]; p; p = p->next) - { - if (p->symbol != symbol) - { - pref = p; - symbol = p->symbol; - } - else if (i == final_state && symbol == 0) - { - SRcount++; - p->suppressed = 1; - } - else if (pref->action_code == SHIFT) - { - if (pref->prec > 0 && p->prec > 0) - { - if (pref->prec < p->prec) - { - pref->suppressed = 2; - pref = p; - } - else if (pref->prec > p->prec) - { - p->suppressed = 2; - } - else if (pref->assoc == LEFT) - { - pref->suppressed = 2; - pref = p; - } - else if (pref->assoc == RIGHT) - { - p->suppressed = 2; - } - else - { - pref->suppressed = 2; - p->suppressed = 2; - } - } - else - { - SRcount++; - p->suppressed = 1; - } - } - else - { - RRcount++; - p->suppressed = 1; - } - } - SRtotal += SRcount; - RRtotal += RRcount; - SRconflicts[i] = SRcount; - RRconflicts[i] = RRcount; - } -} - - -total_conflicts() -{ - fprintf(stderr, "%s: ", myname); - if (SRtotal == 1) - fprintf(stderr, "1 shift/reduce conflict"); - else if (SRtotal > 1) - fprintf(stderr, "%d shift/reduce conflicts", SRtotal); - - if (SRtotal && RRtotal) - fprintf(stderr, ", "); - - if (RRtotal == 1) - fprintf(stderr, "1 reduce/reduce conflict"); - else if (RRtotal > 1) - fprintf(stderr, "%d reduce/reduce conflicts", RRtotal); - - fprintf(stderr, ".\n"); -} - - -int -sole_reduction(stateno) -int stateno; -{ - register int count, ruleno; - register action *p; - - count = 0; - ruleno = 0; - for (p = parser[stateno]; p; p = p->next) - { - if (p->action_code == SHIFT && p->suppressed == 0) - return (0); - else if (p->action_code == REDUCE && p->suppressed == 0) - { - if (ruleno > 0 && p->number != ruleno) - return (0); - if (p->symbol != 1) - ++count; - ruleno = p->number; - } - } - - if (count == 0) - return (0); - return (ruleno); -} - - -defreds() -{ - register int i; - - defred = NEW2(nstates, short); - for (i = 0; i < nstates; i++) - defred[i] = sole_reduction(i); -} - -free_action_row(p) -register action *p; -{ - register action *q; - - while (p) - { - q = p->next; - FREE(p); - p = q; - } -} - -free_parser() -{ - register int i; - - for (i = 0; i < nstates; i++) - free_action_row(parser[i]); - - FREE(parser); -} - diff --git a/util/byacc/output.c b/util/byacc/output.c deleted file mode 100644 index b9b468a96..000000000 --- a/util/byacc/output.c +++ /dev/null @@ -1,1146 +0,0 @@ -#include "defs.h" - -static int nvectors; -static int nentries; -static short **froms; -static short **tos; -static short *tally; -static short *width; -static short *state_count; -static short *order; -static short *base; -static short *pos; -static int maxtable; -static short *table; -static short *check; -static int lowzero; -static int high; - - -output() -{ - free_itemsets(); - free_shifts(); - free_reductions(); - output_stored_text(); - output_defines(); - output_rule_data(); - output_yydefred(); - output_actions(); - free_parser(); - output_debug(); - output_stype(); - if (rflag) write_section(tables); - write_section(header); - output_trailing_text(); - write_section(body); - output_semantic_actions(); - write_section(trailer); -} - - -output_rule_data() -{ - register int i; - register int j; - - - fprintf(output_file, "short yylhs[] = {%42d,", - symbol_value[start_symbol]); - - j = 10; - for (i = 3; i < nrules; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", symbol_value[rlhs[i]]); - } - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - - fprintf(output_file, "short yylen[] = {%42d,", 2); - - j = 10; - for (i = 3; i < nrules; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - j++; - - fprintf(output_file, "%5d,", rrhs[i + 1] - rrhs[i] - 1); - } - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); -} - - -output_yydefred() -{ - register int i, j; - - fprintf(output_file, "short yydefred[] = {%39d,", - (defred[0] ? defred[0] - 2 : 0)); - - j = 10; - for (i = 1; i < nstates; i++) - { - if (j < 10) - ++j; - else - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - - fprintf(output_file, "%5d,", (defred[i] ? defred[i] - 2 : 0)); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); -} - - -output_actions() -{ - nvectors = 2*nstates + nvars; - - froms = NEW2(nvectors, short *); - tos = NEW2(nvectors, short *); - tally = NEW2(nvectors, short); - width = NEW2(nvectors, short); - - token_actions(); - FREE(lookaheads); - FREE(LA); - FREE(LAruleno); - FREE(accessing_symbol); - - goto_actions(); - FREE(goto_map + ntokens); - FREE(from_state); - FREE(to_state); - - sort_actions(); - pack_table(); - output_base(); - output_table(); - output_check(); -} - - -token_actions() -{ - register int i, j; - register int shiftcount, reducecount; - register int max, min; - register short *actionrow, *r, *s; - register action *p; - - actionrow = NEW2(2*ntokens, short); - for (i = 0; i < nstates; ++i) - { - if (parser[i]) - { - for (j = 0; j < 2*ntokens; ++j) - actionrow[j] = 0; - - shiftcount = 0; - reducecount = 0; - for (p = parser[i]; p; p = p->next) - { - if (p->suppressed == 0) - { - if (p->action_code == SHIFT) - { - ++shiftcount; - actionrow[p->symbol] = p->number; - } - else if (p->action_code == REDUCE && p->number != defred[i]) - { - ++reducecount; - actionrow[p->symbol + ntokens] = p->number; - } - } - } - - tally[i] = shiftcount; - tally[nstates+i] = reducecount; - width[i] = 0; - width[nstates+i] = 0; - if (shiftcount > 0) - { - froms[i] = r = NEW2(shiftcount, short); - tos[i] = s = NEW2(shiftcount, short); - min = MAXSHORT; - max = 0; - for (j = 0; j < ntokens; ++j) - { - if (actionrow[j]) - { - if (min > symbol_value[j]) - min = symbol_value[j]; - if (max < symbol_value[j]) - max = symbol_value[j]; - *r++ = symbol_value[j]; - *s++ = actionrow[j]; - } - } - width[i] = max - min + 1; - } - if (reducecount > 0) - { - froms[nstates+i] = r = NEW2(reducecount, short); - tos[nstates+i] = s = NEW2(reducecount, short); - min = MAXSHORT; - max = 0; - for (j = 0; j < ntokens; ++j) - { - if (actionrow[ntokens+j]) - { - if (min > symbol_value[j]) - min = symbol_value[j]; - if (max < symbol_value[j]) - max = symbol_value[j]; - *r++ = symbol_value[j]; - *s++ = actionrow[ntokens+j] - 2; - } - } - width[nstates+i] = max - min + 1; - } - } - } - FREE(actionrow); -} - -goto_actions() -{ - register int i, j, k; - - state_count = NEW2(nstates, short); - - k = default_goto(start_symbol + 1); - fprintf(output_file, "short yydgoto[] = {%40d,", k); - save_column(start_symbol + 1, k); - - j = 10; - for (i = start_symbol + 2; i < nsyms; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - k = default_goto(i); - fprintf(output_file, "%5d,", k); - save_column(i, k); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - FREE(state_count); -} - -int -default_goto(symbol) -int symbol; -{ - register int i; - register int m; - register int n; - register int default_state; - register int max; - - m = goto_map[symbol]; - n = goto_map[symbol + 1]; - - if (m == n) return (0); - - for (i = 0; i < nstates; i++) - state_count[i] = 0; - - for (i = m; i < n; i++) - state_count[to_state[i]]++; - - max = 0; - default_state = 0; - for (i = 0; i < nstates; i++) - { - if (state_count[i] > max) - { - max = state_count[i]; - default_state = i; - } - } - - return (default_state); -} - - - -save_column(symbol, default_state) -int symbol; -int default_state; -{ - register int i; - register int m; - register int n; - register short *sp; - register short *sp1; - register short *sp2; - register int count; - register int symno; - - m = goto_map[symbol]; - n = goto_map[symbol + 1]; - - count = 0; - for (i = m; i < n; i++) - { - if (to_state[i] != default_state) - ++count; - } - if (count == 0) return; - - symno = symbol_value[symbol] + 2*nstates; - - froms[symno] = sp1 = sp = NEW2(count, short); - tos[symno] = sp2 = NEW2(count, short); - - for (i = m; i < n; i++) - { - if (to_state[i] != default_state) - { - *sp1++ = from_state[i]; - *sp2++ = to_state[i]; - } - } - - tally[symno] = count; - width[symno] = sp1[-1] - sp[0] + 1; -} - -sort_actions() -{ - register int i; - register int j; - register int k; - register int t; - register int w; - - order = NEW2(nvectors, short); - nentries = 0; - - for (i = 0; i < nvectors; i++) - { - if (tally[i] > 0) - { - t = tally[i]; - w = width[i]; - j = nentries - 1; - - while (j >= 0 && (width[order[j]] < w)) - j--; - - while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t)) - j--; - - for (k = nentries - 1; k > j; k--) - order[k + 1] = order[k]; - - order[j + 1] = i; - nentries++; - } - } -} - - -pack_table() -{ - register int i; - register int place; - register int state; - - base = NEW2(nvectors, short); - pos = NEW2(nentries, short); - - maxtable = 1000; - table = NEW2(maxtable, short); - check = NEW2(maxtable, short); - - lowzero = 0; - high = 0; - - for (i = 0; i < maxtable; i++) - check[i] = -1; - - for (i = 0; i < nentries; i++) - { - state = matching_vector(i); - - if (state < 0) - place = pack_vector(i); - else - place = base[state]; - - pos[i] = place; - base[order[i]] = place; - } - - for (i = 0; i < nvectors; i++) - { - if (froms[i]) - FREE(froms[i]); - if (tos[i]) - FREE(tos[i]); - } - - FREE(froms); - FREE(tos); - FREE(pos); -} - - -/* The function matching_vector determines if the vector specified by */ -/* the input parameter matches a previously considered vector. The */ -/* test at the start of the function checks if the vector represents */ -/* a row of shifts over terminal symbols or a row of reductions, or a */ -/* column of shifts over a nonterminal symbol. Berkeley Yacc does not */ -/* check if a column of shifts over a nonterminal symbols matches a */ -/* previously considered vector. Because of the nature of LR parsing */ -/* tables, no two columns can match. Therefore, the only possible */ -/* match would be between a row and a column. Such matches are */ -/* unlikely. Therefore, to save time, no attempt is made to see if a */ -/* column matches a previously considered vector. */ -/* */ -/* Matching_vector is poorly designed. The test could easily be made */ -/* faster. Also, it depends on the vectors being in a specific */ -/* order. */ - -int -matching_vector(vector) -int vector; -{ - register int i; - register int j; - register int k; - register int t; - register int w; - register int match; - register int prev; - - i = order[vector]; - if (i >= 2*nstates) - return (-1); - - t = tally[i]; - w = width[i]; - - for (prev = vector - 1; prev >= 0; prev--) - { - j = order[prev]; - if (width[j] != w || tally[j] != t) - return (-1); - - match = 1; - for (k = 0; match && k < t; k++) - { - if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]) - match = 0; - } - - if (match) - return (j); - } - - return (-1); -} - - - -int -pack_vector(vector) -int vector; -{ - register int i, j, k, l; - register int t; - register int loc; - register int ok; - register short *from; - register short *to; - int newmax; - - i = order[vector]; - t = tally[i]; - assert(t); - - from = froms[i]; - to = tos[i]; - - j = lowzero - from[0]; - for (k = 1; k < t; ++k) - if (lowzero - from[k] > j) - j = lowzero - from[k]; - for (;; ++j) - { - if (j == 0) - continue; - ok = 1; - for (k = 0; ok && k < t; k++) - { - loc = j + from[k]; - if (loc >= maxtable) - { - if (loc >= MAXTABLE) - fatal("maximum table size exceeded"); - - newmax = maxtable; - do { newmax += 200; } while (newmax <= loc); - table = (short *) REALLOC(table, newmax*sizeof(short)); - if (table == 0) no_space(); - check = (short *) REALLOC(check, newmax*sizeof(short)); - if (check == 0) no_space(); - for (l = maxtable; l < newmax; ++l) - { - table[l] = 0; - check[l] = -1; - } - maxtable = newmax; - } - - if (check[loc] != -1) - ok = 0; - } - for (k = 0; ok && k < vector; k++) - { - if (pos[k] == j) - ok = 0; - } - if (ok) - { - for (k = 0; k < t; k++) - { - loc = j + from[k]; - table[loc] = to[k]; - check[loc] = from[k]; - if (loc > high) high = loc; - } - - while (check[lowzero] != -1) - ++lowzero; - - return (j); - } - } -} - - - -output_base() -{ - register int i, j; - - fprintf(output_file, "short yysindex[] = {%39d,", base[0]); - - j = 10; - for (i = 1; i < nstates; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", base[i]); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\nshort yyrindex[] = {%39d,", - base[nstates]); - - j = 10; - for (i = nstates + 1; i < 2*nstates; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", base[i]); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\nshort yygindex[] = {%39d,", - base[2*nstates]); - - j = 10; - for (i = 2*nstates + 1; i < nvectors - 1; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", base[i]); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - FREE(base); -} - - - -output_table() -{ - register int i; - register int j; - - ++outline; - fprintf(code_file, "#define YYTABLESIZE %d\n", high); - fprintf(output_file, "short yytable[] = {%40d,", table[0]); - - j = 10; - for (i = 1; i <= high; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", table[i]); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - FREE(table); -} - - - -output_check() -{ - register int i; - register int j; - - fprintf(output_file, "short yycheck[] = {%40d,", check[0]); - - j = 10; - for (i = 1; i <= high; i++) - { - if (j >= 10) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 1; - } - else - ++j; - - fprintf(output_file, "%5d,", check[i]); - } - - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - FREE(check); -} - - -int -is_C_identifier(name) -char *name; -{ - register char *s; - register int c; - - s = name; - c = *s; - if (c == '"') - { - c = *++s; - if (!isalpha(c) && c != '_' && c != '$') - return (0); - while ((c = *++s) != '"') - { - if (!isalnum(c) && c != '_' && c != '$') - return (0); - } - return (1); - } - - if (!isalpha(c) && c != '_' && c != '$') - return (0); - while (c = *++s) - { - if (!isalnum(c) && c != '_' && c != '$') - return (0); - } - return (1); -} - - -output_defines() -{ - register int c, i; - register char *s; - - for (i = 2; i < ntokens; ++i) - { - s = symbol_name[i]; - if (is_C_identifier(s)) - { - fprintf(code_file, "#define "); - if (dflag) fprintf(defines_file, "#define "); - c = *s; - if (c == '"') - { - while ((c = *++s) != '"') - { - putc(c, code_file); - if (dflag) putc(c, defines_file); - } - } - else - { - do - { - putc(c, code_file); - if (dflag) putc(c, defines_file); - } - while (c = *++s); - } - ++outline; - fprintf(code_file, " %d\n", symbol_value[i]); - if (dflag) fprintf(defines_file, " %d\n", symbol_value[i]); - } - } - - ++outline; - fprintf(code_file, "#define YYERRCODE %d\n", symbol_value[1]); - - if (dflag && unionized) - { - fclose(union_file); - union_file = fopen(union_file_name, "r"); - if (union_file == NULL) open_error(union_file_name); - while ((c = getc(union_file)) != EOF) - putc(c, defines_file); - fprintf(defines_file, " YYSTYPE;\nextern YYSTYPE yylval;\n"); - } -} - - -output_stored_text() -{ - register int c; - register FILE *in, *out; - - fclose(text_file); - text_file = fopen(text_file_name, "r"); - if (text_file == NULL) - open_error(text_file_name); - in = text_file; - if ((c = getc(in)) == EOF) - return; - out = code_file; - if (c == '\n') - ++outline; - putc(c, out); - while ((c = getc(in)) != EOF) - { - if (c == '\n') - ++outline; - putc(c, out); - } - if (!lflag) - fprintf(out, line_format, ++outline + 1, code_file_name); -} - - -output_debug() -{ - register int i, j, k, max; - char **symnam, *s; - - ++outline; - fprintf(code_file, "#define YYFINAL %d\n", final_state); - outline += 3; - fprintf(code_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n", - tflag); - if (rflag) - fprintf(output_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n", - tflag); - - max = 0; - for (i = 2; i < ntokens; ++i) - if (symbol_value[i] > max) - max = symbol_value[i]; - ++outline; - fprintf(code_file, "#define YYMAXTOKEN %d\n", max); - - symnam = (char **) MALLOC((max+1)*sizeof(char *)); - if (symnam == 0) no_space(); - - /* Note that it is not necessary to initialize the element */ - /* symnam[max]. */ - for (i = 0; i < max; ++i) - symnam[i] = 0; - for (i = ntokens - 1; i >= 2; --i) - symnam[symbol_value[i]] = symbol_name[i]; - symnam[0] = "end-of-file"; - - if (!rflag) ++outline; - fprintf(output_file, "#if YYDEBUG\nchar *yyname[] = {"); - j = 80; - for (i = 0; i <= max; ++i) - { - if (s = symnam[i]) - { - if (s[0] == '"') - { - k = 7; - while (*++s != '"') - { - ++k; - if (*s == '\\') - { - k += 2; - if (*++s == '\\') - ++k; - } - } - j += k; - if (j > 80) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = k; - } - fprintf(output_file, "\"\\\""); - s = symnam[i]; - while (*++s != '"') - { - if (*s == '\\') - { - fprintf(output_file, "\\\\"); - if (*++s == '\\') - fprintf(output_file, "\\\\"); - else - putc(*s, output_file); - } - else - putc(*s, output_file); - } - fprintf(output_file, "\\\"\","); - } - else if (s[0] == '\'') - { - if (s[1] == '"') - { - j += 7; - if (j > 80) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 7; - } - fprintf(output_file, "\"'\\\"'\","); - } - else - { - k = 5; - while (*++s != '\'') - { - ++k; - if (*s == '\\') - { - k += 2; - if (*++s == '\\') - ++k; - } - } - j += k; - if (j > 80) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = k; - } - fprintf(output_file, "\"'"); - s = symnam[i]; - while (*++s != '\'') - { - if (*s == '\\') - { - fprintf(output_file, "\\\\"); - if (*++s == '\\') - fprintf(output_file, "\\\\"); - else - putc(*s, output_file); - } - else - putc(*s, output_file); - } - fprintf(output_file, "'\","); - } - } - else - { - k = strlen(s) + 3; - j += k; - if (j > 80) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = k; - } - putc('"', output_file); - do { putc(*s, output_file); } while (*++s); - fprintf(output_file, "\","); - } - } - else - { - j += 2; - if (j > 80) - { - if (!rflag) ++outline; - putc('\n', output_file); - j = 2; - } - fprintf(output_file, "0,"); - } - } - if (!rflag) outline += 2; - fprintf(output_file, "\n};\n"); - FREE(symnam); - - if (!rflag) ++outline; - fprintf(output_file, "char *yyrule[] = {\n"); - for (i = 2; i < nrules; ++i) - { - fprintf(output_file, "\"%s :", symbol_name[rlhs[i]]); - for (j = rrhs[i]; ritem[j] > 0; ++j) - { - s = symbol_name[ritem[j]]; - if (s[0] == '"') - { - fprintf(output_file, " \\\""); - while (*++s != '"') - { - if (*s == '\\') - { - if (s[1] == '\\') - fprintf(output_file, "\\\\\\\\"); - else - fprintf(output_file, "\\\\%c", s[1]); - ++s; - } - else - putc(*s, output_file); - } - fprintf(output_file, "\\\""); - } - else if (s[0] == '\'') - { - if (s[1] == '"') - fprintf(output_file, " '\\\"'"); - else if (s[1] == '\\') - { - if (s[2] == '\\') - fprintf(output_file, " '\\\\\\\\"); - else - fprintf(output_file, " '\\\\%c", s[2]); - s += 2; - while (*++s != '\'') - putc(*s, output_file); - putc('\'', output_file); - } - else - fprintf(output_file, " '%c'", s[1]); - } - else - fprintf(output_file, " %s", s); - } - if (!rflag) ++outline; - fprintf(output_file, "\",\n"); - } - - if (!rflag) outline += 2; - fprintf(output_file, "};\n#endif\n"); -} - - -output_stype() -{ - if (!unionized && ntags == 0) - { - outline += 3; - fprintf(code_file, "#ifndef YYSTYPE\ntypedef int YYSTYPE;\n#endif\n"); - } -} - - -output_trailing_text() -{ - register int c, last; - register FILE *in, *out; - - if (line == 0) - return; - - in = input_file; - out = code_file; - c = *cptr; - if (c == '\n') - { - ++lineno; - if ((c = getc(in)) == EOF) - return; - if (!lflag) - { - ++outline; - fprintf(out, line_format, lineno, input_file_name); - } - if (c == '\n') - ++outline; - putc(c, out); - last = c; - } - else - { - if (!lflag) - { - ++outline; - fprintf(out, line_format, lineno, input_file_name); - } - do { putc(c, out); } while ((c = *++cptr) != '\n'); - ++outline; - putc('\n', out); - last = '\n'; - } - - while ((c = getc(in)) != EOF) - { - if (c == '\n') - ++outline; - putc(c, out); - last = c; - } - - if (last != '\n') - { - ++outline; - putc('\n', out); - } - if (!lflag) - fprintf(out, line_format, ++outline + 1, code_file_name); -} - - -output_semantic_actions() -{ - register int c, last; - register FILE *out; - - fclose(action_file); - action_file = fopen(action_file_name, "r"); - if (action_file == NULL) - open_error(action_file_name); - - if ((c = getc(action_file)) == EOF) - return; - - out = code_file; - last = c; - if (c == '\n') - ++outline; - putc(c, out); - while ((c = getc(action_file)) != EOF) - { - if (c == '\n') - ++outline; - putc(c, out); - last = c; - } - - if (last != '\n') - { - ++outline; - putc('\n', out); - } - - if (!lflag) - fprintf(out, line_format, ++outline + 1, code_file_name); -} - - -free_itemsets() -{ - register core *cp, *next; - - FREE(state_table); - for (cp = first_state; cp; cp = next) - { - next = cp->next; - FREE(cp); - } -} - - -free_shifts() -{ - register shifts *sp, *next; - - FREE(shift_table); - for (sp = first_shift; sp; sp = next) - { - next = sp->next; - FREE(sp); - } -} - - - -free_reductions() -{ - register reductions *rp, *next; - - FREE(reduction_table); - for (rp = first_reduction; rp; rp = next) - { - next = rp->next; - FREE(rp); - } -} diff --git a/util/byacc/proto.make b/util/byacc/proto.make deleted file mode 100644 index 8da25ce49..000000000 --- a/util/byacc/proto.make +++ /dev/null @@ -1,99 +0,0 @@ -# $Id$ - -#PARAMS do not remove this line! - -SRC_DIR = $(SRC_HOME)/util/byacc -DEST = $(TARGET_HOME)/bin - -HDRS = $(SRC_DIR)/defs.h - -INCLUDES = -I$(SRC_DIR) -CFLAGS = $(COPTIONS) $(INCLUDES) -LDFLAGS = $(LDOPTIONS) -LINTFLAGS = $(LINTOPTIONS) $(INCLUDES) - -OBJS = closure.$(SUF) \ - error.$(SUF) \ - lalr.$(SUF) \ - lr0.$(SUF) \ - main.$(SUF) \ - mkpar.$(SUF) \ - output.$(SUF) \ - reader.$(SUF) \ - skeleton.$(SUF) \ - symtab.$(SUF) \ - verbose.$(SUF) \ - warshall.$(SUF) - -PROGRAM = yacc - -SRCS = $(SRC_DIR)/closure.c \ - $(SRC_DIR)/error.c \ - $(SRC_DIR)/lalr.c \ - $(SRC_DIR)/lr0.c \ - $(SRC_DIR)/main.c \ - $(SRC_DIR)/mkpar.c \ - $(SRC_DIR)/output.c \ - $(SRC_DIR)/reader.c \ - $(SRC_DIR)/skeleton.c \ - $(SRC_DIR)/symtab.c \ - $(SRC_DIR)/verbose.c \ - $(SRC_DIR)/warshall.c - -all: $(PROGRAM) - -$(PROGRAM): $(OBJS) - $(CC) $(LDFLAGS) -o $(PROGRAM) $(OBJS) - -clean: - rm -f $(OBJS) $(PROGRAM) - -install: $(PROGRAM) - cp $(PROGRAM) $(DEST)/$(PROGRAM) - if [ $(DO_MACHINE_INDEP) = y ] ; \ - then cp $(SRC_DIR)/manpage yacc.1 ; \ - mk_manpage yacc.1 $(TARGET_HOME) ; \ - rm -f yacc.1 ; \ - fi - -cmp: $(PROGRAM) - -cmp $(PROGRAM) $(DEST)/$(PROGRAM) - -pr: - @pr proto.make $(HDRS) $(SRCS) - -opr: - make pr | opr - -lint: - $(LINT) $(LINTFLAGS) $(SRCS) - -program: $(PROGRAM) - -tags: $(HDRS) $(SRCS) - @ctags $(HDRS) $(SRCS) - -closure.$(SUF): $(SRC_DIR)/closure.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/closure.c -error.$(SUF): $(SRC_DIR)/error.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/error.c -lalr.$(SUF): $(SRC_DIR)/lalr.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/lalr.c -lr0.$(SUF): $(SRC_DIR)/lr0.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/lr0.c -main.$(SUF): $(SRC_DIR)/main.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/main.c -mkpar.$(SUF): $(SRC_DIR)/mkpar.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/mkpar.c -output.$(SUF): $(SRC_DIR)/output.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/output.c -reader.$(SUF): $(SRC_DIR)/reader.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/reader.c -skeleton.$(SUF): $(SRC_DIR)/skeleton.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/skeleton.c -symtab.$(SUF): $(SRC_DIR)/symtab.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/symtab.c -verbose.$(SUF): $(SRC_DIR)/verbose.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/verbose.c -warshall.$(SUF): $(SRC_DIR)/warshall.c $(SRC_DIR)/defs.h - $(CC) -c $(CFLAGS) $(SRC_DIR)/warshall.c diff --git a/util/byacc/reader.c b/util/byacc/reader.c deleted file mode 100644 index 52d368642..000000000 --- a/util/byacc/reader.c +++ /dev/null @@ -1,1770 +0,0 @@ -#include "defs.h" - -/* The line size must be a positive integer. One hundred was chosen */ -/* because few lines in Yacc input grammars exceed 100 characters. */ -/* Note that if a line exceeds LINESIZE characters, the line buffer */ -/* will be expanded to accomodate it. */ - -#define LINESIZE 100 - -char *cache; -int cinc, cache_size; - -int ntags, tagmax; -char **tag_table; - -char saw_eof, unionized; -char *cptr, *line; -int linesize; - -bucket *goal; -int prec; -int gensym; -char last_was_action; - -int maxitems; -bucket **pitem; - -int maxrules; -bucket **plhs; - -int name_pool_size; -char *name_pool; - -char line_format[] = "#line %d \"%s\"\n"; - - -cachec(c) -int c; -{ - assert(cinc >= 0); - if (cinc >= cache_size) - { - cache_size += 256; - cache = REALLOC(cache, cache_size); - if (cache == 0) no_space(); - } - cache[cinc] = c; - ++cinc; -} - - -get_line() -{ - register FILE *f = input_file; - register int c; - register int i; - - if (saw_eof || (c = getc(f)) == EOF) - { - if (line) { FREE(line); line = 0; } - cptr = 0; - saw_eof = 1; - return; - } - - if (line == 0 || linesize != (LINESIZE + 1)) - { - if (line) FREE(line); - linesize = LINESIZE + 1; - line = MALLOC(linesize); - if (line == 0) no_space(); - } - - i = 0; - ++lineno; - for (;;) - { - line[i] = c; - if (c == '\n') { cptr = line; return; } - if (++i >= linesize) - { - linesize += LINESIZE; - line = REALLOC(line, linesize); - if (line == 0) no_space(); - } - c = getc(f); - if (c == EOF) - { - line[i] = '\n'; - saw_eof = 1; - cptr = line; - return; - } - } -} - - -char * -dup_line() -{ - register char *p, *s, *t; - - if (line == 0) return (0); - s = line; - while (*s != '\n') ++s; - p = MALLOC(s - line + 1); - if (p == 0) no_space(); - - s = line; - t = p; - while ((*t++ = *s++) != '\n') continue; - return (p); -} - - -skip_comment() -{ - register char *s; - - int st_lineno = lineno; - char *st_line = dup_line(); - char *st_cptr = st_line + (cptr - line); - - s = cptr + 2; - for (;;) - { - if (*s == '*' && s[1] == '/') - { - cptr = s + 2; - FREE(st_line); - return; - } - if (*s == '\n') - { - get_line(); - if (line == 0) - unterminated_comment(st_lineno, st_line, st_cptr); - s = cptr; - } - else - ++s; - } -} - - -int -nextc() -{ - register char *s; - - if (line == 0) - { - get_line(); - if (line == 0) - return (EOF); - } - - s = cptr; - for (;;) - { - switch (*s) - { - case '\n': - get_line(); - if (line == 0) return (EOF); - s = cptr; - break; - - case ' ': - case '\t': - case '\f': - case '\r': - case '\013': /* ACK_MOD, '\v' is not K&R C */ - case ',': - case ';': - ++s; - break; - - case '\\': - cptr = s; - return ('%'); - - case '/': - if (s[1] == '*') - { - cptr = s; - skip_comment(); - s = cptr; - break; - } - else if (s[1] == '/') - { - get_line(); - if (line == 0) return (EOF); - s = cptr; - break; - } - /* fall through */ - - default: - cptr = s; - return (*s); - } - } -} - - -int -keyword() -{ - register int c; - char *t_cptr = cptr; - - c = *++cptr; - if (isalpha(c)) - { - cinc = 0; - for (;;) - { - if (isalpha(c)) - { - if (isupper(c)) c = tolower(c); - cachec(c); - } - else if (isdigit(c) || c == '_' || c == '.' || c == '$') - cachec(c); - else - break; - c = *++cptr; - } - cachec(NUL); - - if (strcmp(cache, "token") == 0 || strcmp(cache, "term") == 0) - return (TOKEN); - if (strcmp(cache, "type") == 0) - return (TYPE); - if (strcmp(cache, "left") == 0) - return (LEFT); - if (strcmp(cache, "right") == 0) - return (RIGHT); - if (strcmp(cache, "nonassoc") == 0 || strcmp(cache, "binary") == 0) - return (NONASSOC); - if (strcmp(cache, "start") == 0) - return (START); - if (strcmp(cache, "union") == 0) - return (UNION); - if (strcmp(cache, "ident") == 0) - return (IDENT); - } - else - { - ++cptr; - if (c == '{') - return (TEXT); - if (c == '%' || c == '\\') - return (MARK); - if (c == '<') - return (LEFT); - if (c == '>') - return (RIGHT); - if (c == '0') - return (TOKEN); - if (c == '2') - return (NONASSOC); - } - syntax_error(lineno, line, t_cptr); - /*NOTREACHED*/ -} - - -copy_ident() -{ - register int c; - register FILE *f = output_file; - - c = nextc(); - if (c == EOF) unexpected_EOF(); - if (c != '"') syntax_error(lineno, line, cptr); - ++outline; - fprintf(f, "#ident \""); - for (;;) - { - c = *++cptr; - if (c == '\n') - { - fprintf(f, "\"\n"); - return; - } - putc(c, f); - if (c == '"') - { - putc('\n', f); - ++cptr; - return; - } - } -} - - -copy_text() -{ - register int c; - int quote; - register FILE *f = text_file; - int need_newline = 0; - int t_lineno = lineno; - char *t_line = dup_line(); - char *t_cptr = t_line + (cptr - line - 2); - - if (*cptr == '\n') - { - get_line(); - if (line == 0) - unterminated_text(t_lineno, t_line, t_cptr); - } - if (!lflag) fprintf(f, line_format, lineno, input_file_name); - -loop: - c = *cptr++; - switch (c) - { - case '\n': - next_line: - putc('\n', f); - need_newline = 0; - get_line(); - if (line) goto loop; - unterminated_text(t_lineno, t_line, t_cptr); - - case '\'': - case '"': - { - int s_lineno = lineno; - char *s_line = dup_line(); - char *s_cptr = s_line + (cptr - line - 1); - - quote = c; - putc(c, f); - for (;;) - { - c = *cptr++; - putc(c, f); - if (c == quote) - { - need_newline = 1; - FREE(s_line); - goto loop; - } - if (c == '\n') - unterminated_string(s_lineno, s_line, s_cptr); - if (c == '\\') - { - c = *cptr++; - putc(c, f); - if (c == '\n') - { - get_line(); - if (line == 0) - unterminated_string(s_lineno, s_line, s_cptr); - } - } - } - } - - case '/': - putc(c, f); - need_newline = 1; - c = *cptr; - if (c == '/') - { - putc('*', f); - while ((c = *++cptr) != '\n') - { - if (c == '*' && cptr[1] == '/') - fprintf(f, "* "); - else - putc(c, f); - } - fprintf(f, "*/"); - goto next_line; - } - if (c == '*') - { - int c_lineno = lineno; - char *c_line = dup_line(); - char *c_cptr = c_line + (cptr - line - 1); - - putc('*', f); - ++cptr; - for (;;) - { - c = *cptr++; - putc(c, f); - if (c == '*' && *cptr == '/') - { - putc('/', f); - ++cptr; - FREE(c_line); - goto loop; - } - if (c == '\n') - { - get_line(); - if (line == 0) - unterminated_comment(c_lineno, c_line, c_cptr); - } - } - } - need_newline = 1; - goto loop; - - case '%': - case '\\': - if (*cptr == '}') - { - if (need_newline) putc('\n', f); - ++cptr; - FREE(t_line); - return; - } - /* fall through */ - - default: - putc(c, f); - need_newline = 1; - goto loop; - } -} - - -copy_union() -{ - register int c; - int quote; - int depth; - int u_lineno = lineno; - char *u_line = dup_line(); - char *u_cptr = u_line + (cptr - line - 6); - - if (unionized) over_unionized(cptr - 6); - unionized = 1; - - if (!lflag) - fprintf(text_file, line_format, lineno, input_file_name); - - fprintf(text_file, "typedef union"); - if (dflag) fprintf(union_file, "typedef union"); - - depth = 0; -loop: - c = *cptr++; - putc(c, text_file); - if (dflag) putc(c, union_file); - switch (c) - { - case '\n': - next_line: - get_line(); - if (line == 0) unterminated_union(u_lineno, u_line, u_cptr); - goto loop; - - case '{': - ++depth; - goto loop; - - case '}': - if (--depth == 0) - { - fprintf(text_file, " YYSTYPE;\n"); - FREE(u_line); - return; - } - goto loop; - - case '\'': - case '"': - { - int s_lineno = lineno; - char *s_line = dup_line(); - char *s_cptr = s_line + (cptr - line - 1); - - quote = c; - for (;;) - { - c = *cptr++; - putc(c, text_file); - if (dflag) putc(c, union_file); - if (c == quote) - { - FREE(s_line); - goto loop; - } - if (c == '\n') - unterminated_string(s_lineno, s_line, s_cptr); - if (c == '\\') - { - c = *cptr++; - putc(c, text_file); - if (dflag) putc(c, union_file); - if (c == '\n') - { - get_line(); - if (line == 0) - unterminated_string(s_lineno, s_line, s_cptr); - } - } - } - } - - case '/': - c = *cptr; - if (c == '/') - { - putc('*', text_file); - if (dflag) putc('*', union_file); - while ((c = *++cptr) != '\n') - { - if (c == '*' && cptr[1] == '/') - { - fprintf(text_file, "* "); - if (dflag) fprintf(union_file, "* "); - } - else - { - putc(c, text_file); - if (dflag) putc(c, union_file); - } - } - fprintf(text_file, "*/\n"); - if (dflag) fprintf(union_file, "*/\n"); - goto next_line; - } - if (c == '*') - { - int c_lineno = lineno; - char *c_line = dup_line(); - char *c_cptr = c_line + (cptr - line - 1); - - putc('*', text_file); - if (dflag) putc('*', union_file); - ++cptr; - for (;;) - { - c = *cptr++; - putc(c, text_file); - if (dflag) putc(c, union_file); - if (c == '*' && *cptr == '/') - { - putc('/', text_file); - if (dflag) putc('/', union_file); - ++cptr; - FREE(c_line); - goto loop; - } - if (c == '\n') - { - get_line(); - if (line == 0) - unterminated_comment(c_lineno, c_line, c_cptr); - } - } - } - goto loop; - - default: - goto loop; - } -} - - -int -hexval(c) -int c; -{ - if (c >= '0' && c <= '9') - return (c - '0'); - if (c >= 'A' && c <= 'F') - return (c - 'A' + 10); - if (c >= 'a' && c <= 'f') - return (c - 'a' + 10); - return (-1); -} - - -bucket * -get_literal() -{ - register int c, quote; - register int i; - register int n; - register char *s; - register bucket *bp; - int s_lineno = lineno; - char *s_line = dup_line(); - char *s_cptr = s_line + (cptr - line); - - quote = *cptr++; - cinc = 0; - for (;;) - { - c = *cptr++; - if (c == quote) break; - if (c == '\n') unterminated_string(s_lineno, s_line, s_cptr); - if (c == '\\') - { - char *c_cptr = cptr - 1; - - c = *cptr++; - switch (c) - { - case '\n': - get_line(); - if (line == 0) unterminated_string(s_lineno, s_line, s_cptr); - continue; - - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - n = c - '0'; - c = *cptr; - if (IS_OCTAL(c)) - { - n = (n << 3) + (c - '0'); - c = *++cptr; - if (IS_OCTAL(c)) - { - n = (n << 3) + (c - '0'); - ++cptr; - } - } - if (n > MAXCHAR) illegal_character(c_cptr); - c = n; - break; - - case 'x': - c = *cptr++; - n = hexval(c); - if (n < 0 || n >= 16) - illegal_character(c_cptr); - for (;;) - { - c = *cptr; - i = hexval(c); - if (i < 0 || i >= 16) break; - ++cptr; - n = (n << 4) + i; - if (n > MAXCHAR) illegal_character(c_cptr); - } - c = n; - break; - - case 'a': c = 7; break; - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - case 'v': c = '\013'; break; /* ACK_MOD, '\v' is not K&R C */ - } - } - cachec(c); - } - FREE(s_line); - - n = cinc; - s = MALLOC(n); - if (s == 0) no_space(); - - for (i = 0; i < n; ++i) - s[i] = cache[i]; - - cinc = 0; - if (n == 1) - cachec('\''); - else - cachec('"'); - - for (i = 0; i < n; ++i) - { - c = ((unsigned char *)s)[i]; - if (c == '\\' || c == cache[0]) - { - cachec('\\'); - cachec(c); - } - else if (isprint(c)) - cachec(c); - else - { - cachec('\\'); - switch (c) - { - case 7: cachec('a'); break; - case '\b': cachec('b'); break; - case '\f': cachec('f'); break; - case '\n': cachec('n'); break; - case '\r': cachec('r'); break; - case '\t': cachec('t'); break; - case '\013': cachec('v'); break; /* ACK_MOD, '\v' is not K&R C */ - default: - cachec(((c >> 6) & 7) + '0'); - cachec(((c >> 3) & 7) + '0'); - cachec((c & 7) + '0'); - break; - } - } - } - - if (n == 1) - cachec('\''); - else - cachec('"'); - - cachec(NUL); - bp = lookup(cache); - bp->class = TERM; - if (n == 1 && bp->value == UNDEFINED) - bp->value = *(unsigned char *)s; - FREE(s); - - return (bp); -} - - -int -is_reserved(name) -char *name; -{ - char *s; - - if (strcmp(name, ".") == 0 || - strcmp(name, "$accept") == 0 || - strcmp(name, "$end") == 0) - return (1); - - if (name[0] == '$' && name[1] == '$' && isdigit(name[2])) - { - s = name + 3; - while (isdigit(*s)) ++s; - if (*s == NUL) return (1); - } - - return (0); -} - - -bucket * -get_name() -{ - register int c; - - cinc = 0; - for (c = *cptr; IS_IDENT(c); c = *++cptr) - cachec(c); - cachec(NUL); - - if (is_reserved(cache)) used_reserved(cache); - - return (lookup(cache)); -} - - -int -get_number() -{ - register int c; - register int n; - - n = 0; - for (c = *cptr; isdigit(c); c = *++cptr) - n = 10*n + (c - '0'); - - return (n); -} - - -char * -get_tag() -{ - register int c; - register int i; - register char *s; - int t_lineno = lineno; - char *t_line = dup_line(); - char *t_cptr = t_line + (cptr - line); - - ++cptr; - c = nextc(); - if (c == EOF) unexpected_EOF(); - if (!isalpha(c) && c != '_' && c != '$') - illegal_tag(t_lineno, t_line, t_cptr); - - cinc = 0; - do { cachec(c); c = *++cptr; } while (IS_IDENT(c)); - cachec(NUL); - - c = nextc(); - if (c == EOF) unexpected_EOF(); - if (c != '>') - illegal_tag(t_lineno, t_line, t_cptr); - ++cptr; - - for (i = 0; i < ntags; ++i) - { - if (strcmp(cache, tag_table[i]) == 0) - return (tag_table[i]); - } - - if (ntags >= tagmax) - { - tagmax += 16; - tag_table = (char **) - (tag_table ? REALLOC(tag_table, tagmax*sizeof(char *)) - : MALLOC(tagmax*sizeof(char *))); - if (tag_table == 0) no_space(); - } - - s = MALLOC(cinc); - if (s == 0) no_space(); - strcpy(s, cache); - tag_table[ntags] = s; - ++ntags; - FREE(t_line); - return (s); -} - - -declare_tokens(assoc) -int assoc; -{ - register int c; - register bucket *bp; - int value; - char *tag = 0; - - if (assoc != TOKEN) ++prec; - - c = nextc(); - if (c == EOF) unexpected_EOF(); - if (c == '<') - { - tag = get_tag(); - c = nextc(); - if (c == EOF) unexpected_EOF(); - } - - for (;;) - { - if (isalpha(c) || c == '_' || c == '.' || c == '$') - bp = get_name(); - else if (c == '\'' || c == '"') - bp = get_literal(); - else - return; - - if (bp == goal) tokenized_start(bp->name); - bp->class = TERM; - - if (tag) - { - if (bp->tag && tag != bp->tag) - retyped_warning(bp->name); - bp->tag = tag; - } - - if (assoc != TOKEN) - { - if (bp->prec && prec != bp->prec) - reprec_warning(bp->name); - bp->assoc = assoc; - bp->prec = prec; - } - - c = nextc(); - if (c == EOF) unexpected_EOF(); - value = UNDEFINED; - if (isdigit(c)) - { - value = get_number(); - if (bp->value != UNDEFINED && value != bp->value) - revalued_warning(bp->name); - bp->value = value; - c = nextc(); - if (c == EOF) unexpected_EOF(); - } - } -} - - -declare_types() -{ - register int c; - register bucket *bp; - char *tag; - - c = nextc(); - if (c == EOF) unexpected_EOF(); - if (c != '<') syntax_error(lineno, line, cptr); - tag = get_tag(); - - for (;;) - { - c = nextc(); - if (isalpha(c) || c == '_' || c == '.' || c == '$') - bp = get_name(); - else if (c == '\'' || c == '"') - bp = get_literal(); - else - return; - - if (bp->tag && tag != bp->tag) - retyped_warning(bp->name); - bp->tag = tag; - } -} - - -declare_start() -{ - register int c; - register bucket *bp; - - c = nextc(); - if (c == EOF) unexpected_EOF(); - if (!isalpha(c) && c != '_' && c != '.' && c != '$') - syntax_error(lineno, line, cptr); - bp = get_name(); - if (bp->class == TERM) - terminal_start(bp->name); - if (goal && goal != bp) - restarted_warning(); - goal = bp; -} - - -read_declarations() -{ - register int c, k; - - cache_size = 256; - cache = MALLOC(cache_size); - if (cache == 0) no_space(); - - for (;;) - { - c = nextc(); - if (c == EOF) unexpected_EOF(); - if (c != '%') syntax_error(lineno, line, cptr); - switch (k = keyword()) - { - case MARK: - return; - - case IDENT: - copy_ident(); - break; - - case TEXT: - copy_text(); - break; - - case UNION: - copy_union(); - break; - - case TOKEN: - case LEFT: - case RIGHT: - case NONASSOC: - declare_tokens(k); - break; - - case TYPE: - declare_types(); - break; - - case START: - declare_start(); - break; - } - } -} - - -initialize_grammar() -{ - nitems = 4; - maxitems = 300; - pitem = (bucket **) MALLOC(maxitems*sizeof(bucket *)); - if (pitem == 0) no_space(); - pitem[0] = 0; - pitem[1] = 0; - pitem[2] = 0; - pitem[3] = 0; - - nrules = 3; - maxrules = 100; - plhs = (bucket **) MALLOC(maxrules*sizeof(bucket *)); - if (plhs == 0) no_space(); - plhs[0] = 0; - plhs[1] = 0; - plhs[2] = 0; - rprec = (short *) MALLOC(maxrules*sizeof(short)); - if (rprec == 0) no_space(); - rprec[0] = 0; - rprec[1] = 0; - rprec[2] = 0; - rassoc = (char *) MALLOC(maxrules*sizeof(char)); - if (rassoc == 0) no_space(); - rassoc[0] = TOKEN; - rassoc[1] = TOKEN; - rassoc[2] = TOKEN; -} - - -expand_items() -{ - maxitems += 300; - pitem = (bucket **) REALLOC(pitem, maxitems*sizeof(bucket *)); - if (pitem == 0) no_space(); -} - - -expand_rules() -{ - maxrules += 100; - plhs = (bucket **) REALLOC(plhs, maxrules*sizeof(bucket *)); - if (plhs == 0) no_space(); - rprec = (short *) REALLOC(rprec, maxrules*sizeof(short)); - if (rprec == 0) no_space(); - rassoc = (char *) REALLOC(rassoc, maxrules*sizeof(char)); - if (rassoc == 0) no_space(); -} - - -advance_to_start() -{ - register int c; - register bucket *bp; - char *s_cptr; - int s_lineno; - - for (;;) - { - c = nextc(); - if (c != '%') break; - s_cptr = cptr; - switch (keyword()) - { - case MARK: - no_grammar(); - - case TEXT: - copy_text(); - break; - - case START: - declare_start(); - break; - - default: - syntax_error(lineno, line, s_cptr); - } - } - - c = nextc(); - if (!isalpha(c) && c != '_' && c != '.' && c != '_') - syntax_error(lineno, line, cptr); - bp = get_name(); - if (goal == 0) - { - if (bp->class == TERM) - terminal_start(bp->name); - goal = bp; - } - - s_lineno = lineno; - c = nextc(); - if (c == EOF) unexpected_EOF(); - if (c != ':') syntax_error(lineno, line, cptr); - start_rule(bp, s_lineno); - ++cptr; -} - - -start_rule(bp, s_lineno) -register bucket *bp; -int s_lineno; -{ - if (bp->class == TERM) - terminal_lhs(s_lineno); - bp->class = NONTERM; - if (nrules >= maxrules) - expand_rules(); - plhs[nrules] = bp; - rprec[nrules] = UNDEFINED; - rassoc[nrules] = TOKEN; -} - - -end_rule() -{ - register int i; - - if (!last_was_action && plhs[nrules]->tag) - { - for (i = nitems - 1; pitem[i]; --i) continue; - if (pitem[i+1] == 0 || pitem[i+1]->tag != plhs[nrules]->tag) - default_action_warning(); - } - - last_was_action = 0; - if (nitems >= maxitems) expand_items(); - pitem[nitems] = 0; - ++nitems; - ++nrules; -} - - -insert_empty_rule() -{ - register bucket *bp, **bpp; - - assert(cache); - sprintf(cache, "$$%d", ++gensym); - bp = make_bucket(cache); - last_symbol->next = bp; - last_symbol = bp; - bp->tag = plhs[nrules]->tag; - bp->class = NONTERM; - - if ((nitems += 2) > maxitems) - expand_items(); - bpp = pitem + nitems - 1; - *bpp-- = bp; - while (bpp[0] = bpp[-1]) --bpp; - - if (++nrules >= maxrules) - expand_rules(); - plhs[nrules] = plhs[nrules-1]; - plhs[nrules-1] = bp; - rprec[nrules] = rprec[nrules-1]; - rprec[nrules-1] = 0; - rassoc[nrules] = rassoc[nrules-1]; - rassoc[nrules-1] = TOKEN; -} - - -add_symbol() -{ - register int c; - register bucket *bp; - int s_lineno = lineno; - - c = *cptr; - if (c == '\'' || c == '"') - bp = get_literal(); - else - bp = get_name(); - - c = nextc(); - if (c == ':') - { - end_rule(); - start_rule(bp, s_lineno); - ++cptr; - return; - } - - if (last_was_action) - insert_empty_rule(); - last_was_action = 0; - - if (++nitems > maxitems) - expand_items(); - pitem[nitems-1] = bp; -} - - -copy_action() -{ - register int c; - register int i, n; - int depth; - int quote; - char *tag; - register FILE *f = action_file; - int a_lineno = lineno; - char *a_line = dup_line(); - char *a_cptr = a_line + (cptr - line); - - if (last_was_action) - insert_empty_rule(); - last_was_action = 1; - - fprintf(f, "case %d:\n", nrules - 2); - if (!lflag) - fprintf(f, line_format, lineno, input_file_name); - if (*cptr == '=') ++cptr; - - n = 0; - for (i = nitems - 1; pitem[i]; --i) ++n; - - depth = 0; -loop: - c = *cptr; - if (c == '$') - { - if (cptr[1] == '<') - { - int d_lineno = lineno; - char *d_line = dup_line(); - char *d_cptr = d_line + (cptr - line); - - ++cptr; - tag = get_tag(); - c = *cptr; - if (c == '$') - { - fprintf(f, "yyval.%s", tag); - ++cptr; - FREE(d_line); - goto loop; - } - else if (isdigit(c)) - { - i = get_number(); - if (i > n) dollar_warning(d_lineno, i); - fprintf(f, "yyvsp[%d].%s", i - n, tag); - FREE(d_line); - goto loop; - } - else if (c == '-' && isdigit(cptr[1])) - { - ++cptr; - i = -get_number() - n; - fprintf(f, "yyvsp[%d].%s", i, tag); - FREE(d_line); - goto loop; - } - else - dollar_error(d_lineno, d_line, d_cptr); - } - else if (cptr[1] == '$') - { - if (ntags) - { - tag = plhs[nrules]->tag; - if (tag == 0) untyped_lhs(); - fprintf(f, "yyval.%s", tag); - } - else - fprintf(f, "yyval"); - cptr += 2; - goto loop; - } - else if (isdigit(cptr[1])) - { - ++cptr; - i = get_number(); - if (ntags) - { - if (i <= 0 || i > n) - unknown_rhs(i); - tag = pitem[nitems + i - n - 1]->tag; - if (tag == 0) untyped_rhs(i, pitem[nitems + i - n - 1]->name); - fprintf(f, "yyvsp[%d].%s", i - n, tag); - } - else - { - if (i > n) - dollar_warning(lineno, i); - fprintf(f, "yyvsp[%d]", i - n); - } - goto loop; - } - else if (cptr[1] == '-') - { - cptr += 2; - i = get_number(); - if (ntags) - unknown_rhs(-i); - fprintf(f, "yyvsp[%d]", -i - n); - goto loop; - } - } - if (isalpha(c) || c == '_' || c == '$') - { - do - { - putc(c, f); - c = *++cptr; - } while (isalnum(c) || c == '_' || c == '$'); - goto loop; - } - putc(c, f); - ++cptr; - switch (c) - { - case '\n': - next_line: - get_line(); - if (line) goto loop; - unterminated_action(a_lineno, a_line, a_cptr); - - case ';': - if (depth > 0) goto loop; - fprintf(f, "\nbreak;\n"); - return; - - case '{': - ++depth; - goto loop; - - case '}': - if (--depth > 0) goto loop; - fprintf(f, "\nbreak;\n"); - return; - - case '\'': - case '"': - { - int s_lineno = lineno; - char *s_line = dup_line(); - char *s_cptr = s_line + (cptr - line - 1); - - quote = c; - for (;;) - { - c = *cptr++; - putc(c, f); - if (c == quote) - { - FREE(s_line); - goto loop; - } - if (c == '\n') - unterminated_string(s_lineno, s_line, s_cptr); - if (c == '\\') - { - c = *cptr++; - putc(c, f); - if (c == '\n') - { - get_line(); - if (line == 0) - unterminated_string(s_lineno, s_line, s_cptr); - } - } - } - } - - case '/': - c = *cptr; - if (c == '/') - { - putc('*', f); - while ((c = *++cptr) != '\n') - { - if (c == '*' && cptr[1] == '/') - fprintf(f, "* "); - else - putc(c, f); - } - fprintf(f, "*/\n"); - goto next_line; - } - if (c == '*') - { - int c_lineno = lineno; - char *c_line = dup_line(); - char *c_cptr = c_line + (cptr - line - 1); - - putc('*', f); - ++cptr; - for (;;) - { - c = *cptr++; - putc(c, f); - if (c == '*' && *cptr == '/') - { - putc('/', f); - ++cptr; - FREE(c_line); - goto loop; - } - if (c == '\n') - { - get_line(); - if (line == 0) - unterminated_comment(c_lineno, c_line, c_cptr); - } - } - } - goto loop; - - default: - goto loop; - } -} - - -int -mark_symbol() -{ - register int c; - register bucket *bp; - - c = cptr[1]; - if (c == '%' || c == '\\') - { - cptr += 2; - return (1); - } - - if (c == '=') - cptr += 2; - else if ((c == 'p' || c == 'P') && - ((c = cptr[2]) == 'r' || c == 'R') && - ((c = cptr[3]) == 'e' || c == 'E') && - ((c = cptr[4]) == 'c' || c == 'C') && - ((c = cptr[5], !IS_IDENT(c)))) - cptr += 5; - else - syntax_error(lineno, line, cptr); - - c = nextc(); - if (isalpha(c) || c == '_' || c == '.' || c == '$') - bp = get_name(); - else if (c == '\'' || c == '"') - bp = get_literal(); - else - { - syntax_error(lineno, line, cptr); - /*NOTREACHED*/ - } - - if (rprec[nrules] != UNDEFINED && bp->prec != rprec[nrules]) - prec_redeclared(); - - rprec[nrules] = bp->prec; - rassoc[nrules] = bp->assoc; - return (0); -} - - -read_grammar() -{ - register int c; - - initialize_grammar(); - advance_to_start(); - - for (;;) - { - c = nextc(); - if (c == EOF) break; - if (isalpha(c) || c == '_' || c == '.' || c == '$' || c == '\'' || - c == '"') - add_symbol(); - else if (c == '{' || c == '=') - copy_action(); - else if (c == '|') - { - end_rule(); - start_rule(plhs[nrules-1], 0); - ++cptr; - } - else if (c == '%') - { - if (mark_symbol()) break; - } - else - syntax_error(lineno, line, cptr); - } - end_rule(); -} - - -free_tags() -{ - register int i; - - if (tag_table == 0) return; - - for (i = 0; i < ntags; ++i) - { - assert(tag_table[i]); - FREE(tag_table[i]); - } - FREE(tag_table); -} - - -pack_names() -{ - register bucket *bp; - register char *p, *s, *t; - - name_pool_size = 13; /* 13 == sizeof("$end") + sizeof("$accept") */ - for (bp = first_symbol; bp; bp = bp->next) - name_pool_size += strlen(bp->name) + 1; - name_pool = MALLOC(name_pool_size); - if (name_pool == 0) no_space(); - - strcpy(name_pool, "$accept"); - strcpy(name_pool+8, "$end"); - t = name_pool + 13; - for (bp = first_symbol; bp; bp = bp->next) - { - p = t; - s = bp->name; - while (*t++ = *s++) continue; - FREE(bp->name); - bp->name = p; - } -} - - -check_symbols() -{ - register bucket *bp; - - if (goal->class == UNKNOWN) - undefined_goal(goal->name); - - for (bp = first_symbol; bp; bp = bp->next) - { - if (bp->class == UNKNOWN) - { - undefined_symbol_warning(bp->name); - bp->class = TERM; - } - } -} - - -pack_symbols() -{ - register bucket *bp; - register bucket **v; - register int i, j, k, n; - - nsyms = 2; - ntokens = 1; - for (bp = first_symbol; bp; bp = bp->next) - { - ++nsyms; - if (bp->class == TERM) ++ntokens; - } - start_symbol = ntokens; - nvars = nsyms - ntokens; - - symbol_name = (char **) MALLOC(nsyms*sizeof(char *)); - if (symbol_name == 0) no_space(); - symbol_value = (short *) MALLOC(nsyms*sizeof(short)); - if (symbol_value == 0) no_space(); - symbol_prec = (short *) MALLOC(nsyms*sizeof(short)); - if (symbol_prec == 0) no_space(); - symbol_assoc = MALLOC(nsyms); - if (symbol_assoc == 0) no_space(); - - v = (bucket **) MALLOC(nsyms*sizeof(bucket *)); - if (v == 0) no_space(); - - v[0] = 0; - v[start_symbol] = 0; - - i = 1; - j = start_symbol + 1; - for (bp = first_symbol; bp; bp = bp->next) - { - if (bp->class == TERM) - v[i++] = bp; - else - v[j++] = bp; - } - assert(i == ntokens && j == nsyms); - - for (i = 1; i < ntokens; ++i) - v[i]->index = i; - - goal->index = start_symbol + 1; - k = start_symbol + 2; - while (++i < nsyms) - if (v[i] != goal) - { - v[i]->index = k; - ++k; - } - - goal->value = 0; - k = 1; - for (i = start_symbol + 1; i < nsyms; ++i) - { - if (v[i] != goal) - { - v[i]->value = k; - ++k; - } - } - - k = 0; - for (i = 1; i < ntokens; ++i) - { - n = v[i]->value; - if (n > 256) - { - for (j = k++; j > 0 && symbol_value[j-1] > n; --j) - symbol_value[j] = symbol_value[j-1]; - symbol_value[j] = n; - } - } - - if (v[1]->value == UNDEFINED) - v[1]->value = 256; - - j = 0; - n = 257; - for (i = 2; i < ntokens; ++i) - { - if (v[i]->value == UNDEFINED) - { - while (j < k && n == symbol_value[j]) - { - while (++j < k && n == symbol_value[j]) continue; - ++n; - } - v[i]->value = n; - ++n; - } - } - - symbol_name[0] = name_pool + 8; - symbol_value[0] = 0; - symbol_prec[0] = 0; - symbol_assoc[0] = TOKEN; - for (i = 1; i < ntokens; ++i) - { - symbol_name[i] = v[i]->name; - symbol_value[i] = v[i]->value; - symbol_prec[i] = v[i]->prec; - symbol_assoc[i] = v[i]->assoc; - } - symbol_name[start_symbol] = name_pool; - symbol_value[start_symbol] = -1; - symbol_prec[start_symbol] = 0; - symbol_assoc[start_symbol] = TOKEN; - for (++i; i < nsyms; ++i) - { - k = v[i]->index; - symbol_name[k] = v[i]->name; - symbol_value[k] = v[i]->value; - symbol_prec[k] = v[i]->prec; - symbol_assoc[k] = v[i]->assoc; - } - - FREE(v); -} - - -pack_grammar() -{ - register int i, j; - int assoc, prec; - - ritem = (short *) MALLOC(nitems*sizeof(short)); - if (ritem == 0) no_space(); - rlhs = (short *) MALLOC(nrules*sizeof(short)); - if (rlhs == 0) no_space(); - rrhs = (short *) MALLOC((nrules+1)*sizeof(short)); - if (rrhs == 0) no_space(); - rprec = (short *) REALLOC(rprec, nrules*sizeof(short)); - if (rprec == 0) no_space(); - rassoc = REALLOC(rassoc, nrules); - if (rassoc == 0) no_space(); - - ritem[0] = -1; - ritem[1] = goal->index; - ritem[2] = 0; - ritem[3] = -2; - rlhs[0] = 0; - rlhs[1] = 0; - rlhs[2] = start_symbol; - rrhs[0] = 0; - rrhs[1] = 0; - rrhs[2] = 1; - - j = 4; - for (i = 3; i < nrules; ++i) - { - rlhs[i] = plhs[i]->index; - rrhs[i] = j; - assoc = TOKEN; - prec = 0; - while (pitem[j]) - { - ritem[j] = pitem[j]->index; - if (pitem[j]->class == TERM) - { - prec = pitem[j]->prec; - assoc = pitem[j]->assoc; - } - ++j; - } - ritem[j] = -i; - ++j; - if (rprec[i] == UNDEFINED) - { - rprec[i] = prec; - rassoc[i] = assoc; - } - } - rrhs[i] = j; - - FREE(plhs); - FREE(pitem); -} - - -print_grammar() -{ - register int i, j, k; - int spacing; - register FILE *f = verbose_file; - - if (!vflag) return; - - k = 1; - for (i = 2; i < nrules; ++i) - { - if (rlhs[i] != rlhs[i-1]) - { - if (i != 2) fprintf(f, "\n"); - fprintf(f, "%4d %s :", i - 2, symbol_name[rlhs[i]]); - spacing = strlen(symbol_name[rlhs[i]]) + 1; - } - else - { - fprintf(f, "%4d ", i - 2); - j = spacing; - while (--j >= 0) putc(' ', f); - putc('|', f); - } - - while (ritem[k] >= 0) - { - fprintf(f, " %s", symbol_name[ritem[k]]); - ++k; - } - ++k; - putc('\n', f); - } -} - - -reader() -{ - write_section(banner); - create_symbol_table(); - read_declarations(); - read_grammar(); - free_symbol_table(); - free_tags(); - pack_names(); - check_symbols(); - pack_symbols(); - pack_grammar(); - free_symbols(); - print_grammar(); -} diff --git a/util/byacc/skeleton.c b/util/byacc/skeleton.c deleted file mode 100644 index dc1064cee..000000000 --- a/util/byacc/skeleton.c +++ /dev/null @@ -1,292 +0,0 @@ -#include "defs.h" - -/* The banner used here should be replaced with an #ident directive */ -/* if the target C compiler supports #ident directives. */ -/* */ -/* If the skeleton is changed, the banner should be changed so that */ -/* the altered version can easily be distinguished from the original. */ - -char *banner[] = -{ - "#ifndef lint", - "static char yysccsid[] = \"@(#)yaccpar 1.8 (Berkeley) 01/20/90\";", - "#endif", - "#define YYBYACC 1", - 0 -}; - - -char *tables[] = -{ - "extern short yylhs[];", - "extern short yylen[];", - "extern short yydefred[];", - "extern short yydgoto[];", - "extern short yysindex[];", - "extern short yyrindex[];", - "extern short yygindex[];", - "extern short yytable[];", - "extern short yycheck[];", - "#if YYDEBUG", - "extern char *yyname[];", - "extern char *yyrule[];", - "#endif", - 0 -}; - - -char *header[] = -{ - "#define yyclearin (yychar=(-1))", - "#define yyerrok (yyerrflag=0)", - "#ifdef YYSTACKSIZE", - "#ifndef YYMAXDEPTH", - "#define YYMAXDEPTH YYSTACKSIZE", - "#endif", - "#else", - "#ifdef YYMAXDEPTH", - "#define YYSTACKSIZE YYMAXDEPTH", - "#else", - "#define YYSTACKSIZE 200", /* ACK mod: Changed from 600 to 200 */ - "#define YYMAXDEPTH 200", /* ACK mod: Changed from 600 to 200 */ - "#endif", - "#endif", - "#if YYDEBUG", - "int yydebug;", - "#endif", - "int yynerrs;", - "int yyerrflag;", - "int yychar;", - "YYSTYPE yyval;", - "YYSTYPE yylval;", - "short yyss[YYSTACKSIZE];", - "YYSTYPE yyvs[YYSTACKSIZE];", - "#define yystacksize YYSTACKSIZE", - 0 -}; - - -char *body[] = -{ - "#define YYABORT goto yyabort", - "#define YYACCEPT goto yyaccept", - "#define YYERROR goto yyerrlab", - "int", - "yyparse()", - "{", - " register int yym, yyn, yystate;", - " register short *yyssp;", /* ACK mod: made this a local */ - " register YYSTYPE *yyvsp;", /* ACK mod: made this a local */ - "#if YYDEBUG", - " register char *yys;", - " extern char *getenv();", - "", - " if (yys = getenv(\"YYDEBUG\"))", - " {", - " yyn = *yys;", - " if (yyn >= '0' && yyn <= '9')", - " yydebug = yyn - '0';", - " }", - "#endif", - "", - " yynerrs = 0;", - " yyerrflag = 0;", - " yychar = (-1);", - "", - " yyssp = yyss;", - " yyvsp = yyvs;", - " *yyssp = yystate = 0;", - "", - "yyloop:", - " if (yyn = yydefred[yystate]) goto yyreduce;", - " if (yychar < 0)", - " {", - " if ((yychar = yylex()) < 0) yychar = 0;", - "#if YYDEBUG", - " if (yydebug)", - " {", - " yys = 0;", - " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", - " if (!yys) yys = \"illegal-symbol\";", - " printf(\"yydebug: state %d, reading %d (%s)\\n\", yystate,", - " yychar, yys);", - " }", - "#endif", - " }", - " if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&", - " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)", - " {", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"yydebug: state %d, shifting to state %d\\n\",", - " yystate, yytable[yyn]);", - "#endif", - " if (yyssp >= yyss + yystacksize - 1)", - " {", - " goto yyoverflow;", - " }", - " *++yyssp = yystate = yytable[yyn];", - " *++yyvsp = yylval;", - " yychar = (-1);", - " if (yyerrflag > 0) --yyerrflag;", - " goto yyloop;", - " }", - " if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&", - " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)", - " {", - " yyn = yytable[yyn];", - " goto yyreduce;", - " }", - " if (yyerrflag) goto yyinrecovery;", - "#ifdef lint", - " goto yynewerror;", - "#endif", - "yynewerror:", - " yyerror(\"syntax error\");", - "#ifdef lint", - " goto yyerrlab;", - "#endif", - "yyerrlab:", - " ++yynerrs;", - "yyinrecovery:", - " if (yyerrflag < 3)", - " {", - " yyerrflag = 3;", - " for (;;)", - " {", - " if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&", - " yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)", - " {", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"yydebug: state %d, error recovery shifting\\", - " to state %d\\n\", *yyssp, yytable[yyn]);", - "#endif", - " if (yyssp >= yyss + yystacksize - 1)", - " {", - " goto yyoverflow;", - " }", - " *++yyssp = yystate = yytable[yyn];", - " *++yyvsp = yylval;", - " goto yyloop;", - " }", - " else", - " {", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"yydebug: error recovery discarding state %d\ -\\n\",", - " *yyssp);", - "#endif", - " if (yyssp <= yyss) goto yyabort;", - " --yyssp;", - " --yyvsp;", - " }", - " }", - " }", - " else", - " {", - " if (yychar == 0) goto yyabort;", - "#if YYDEBUG", - " if (yydebug)", - " {", - " yys = 0;", - " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", - " if (!yys) yys = \"illegal-symbol\";", - " printf(\"yydebug: state %d, error recovery discards token %d\ - (%s)\\n\",", - " yystate, yychar, yys);", - " }", - "#endif", - " yychar = (-1);", - " goto yyloop;", - " }", - "yyreduce:", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"yydebug: state %d, reducing by rule %d (%s)\\n\",", - " yystate, yyn, yyrule[yyn]);", - "#endif", - " yym = yylen[yyn];", - " yyval = yyvsp[1-yym];", - " switch (yyn)", - " {", - 0 -}; - - -char *trailer[] = -{ - " }", - " yyssp -= yym;", - " yystate = *yyssp;", - " yyvsp -= yym;", - " yym = yylhs[yyn];", - " if (yystate == 0 && yym == 0)", - " {", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"yydebug: after reduction, shifting from state 0 to\\", - " state %d\\n\", YYFINAL);", - "#endif", - " yystate = YYFINAL;", - " *++yyssp = YYFINAL;", - " *++yyvsp = yyval;", - " if (yychar < 0)", - " {", - " if ((yychar = yylex()) < 0) yychar = 0;", - "#if YYDEBUG", - " if (yydebug)", - " {", - " yys = 0;", - " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", - " if (!yys) yys = \"illegal-symbol\";", - " printf(\"yydebug: state %d, reading %d (%s)\\n\",", - " YYFINAL, yychar, yys);", - " }", - "#endif", - " }", - " if (yychar == 0) goto yyaccept;", - " goto yyloop;", - " }", - " if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&", - " yyn <= YYTABLESIZE && yycheck[yyn] == yystate)", - " yystate = yytable[yyn];", - " else", - " yystate = yydgoto[yym];", - "#if YYDEBUG", - " if (yydebug)", - " printf(\"yydebug: after reduction, shifting from state %d \\", - "to state %d\\n\", *yyssp, yystate);", - "#endif", - " if (yyssp >= yyss + yystacksize - 1)", - " {", - " goto yyoverflow;", - " }", - " *++yyssp = yystate;", - " *++yyvsp = yyval;", - " goto yyloop;", - "yyoverflow:", - " yyerror(\"yacc stack overflow\");", - "yyabort:", - " return (1);", - "yyaccept:", - " return (0);", - "}", - 0 -}; - - -write_section(section) -char *section[]; -{ - register int i; - register FILE *fp; - - fp = code_file; - for (i = 0; section[i]; ++i) - { - ++outline; - fprintf(fp, "%s\n", section[i]); - } -} diff --git a/util/byacc/symtab.c b/util/byacc/symtab.c deleted file mode 100644 index c7c6ac03a..000000000 --- a/util/byacc/symtab.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "defs.h" - - -/* TABLE_SIZE is the number of entries in the symbol table. */ -/* TABLE_SIZE must be a power of two. */ - -#define TABLE_SIZE 1024 - - -bucket **symbol_table; -bucket *first_symbol; -bucket *last_symbol; - - -int -hash(name) -char *name; -{ - register char *s; - register int c, k; - - assert(name && *name); - s = name; - k = *s; - while (c = *++s) - k = (31*k + c) & (TABLE_SIZE - 1); - - return (k); -} - - -bucket * -make_bucket(name) -char *name; -{ - register bucket *bp; - - assert(name); - bp = (bucket *) MALLOC(sizeof(bucket)); - if (bp == 0) no_space(); - bp->link = 0; - bp->next = 0; - bp->name = MALLOC(strlen(name) + 1); - if (bp->name == 0) no_space(); - bp->tag = 0; - bp->value = UNDEFINED; - bp->index = 0; - bp->prec = 0; - bp-> class = UNKNOWN; - bp->assoc = TOKEN; - - if (bp->name == 0) no_space(); - strcpy(bp->name, name); - - return (bp); -} - - -bucket * -lookup(name) -char *name; -{ - register bucket *bp, **bpp; - - bpp = symbol_table + hash(name); - bp = *bpp; - - while (bp) - { - if (strcmp(name, bp->name) == 0) return (bp); - bpp = &bp->link; - bp = *bpp; - } - - *bpp = bp = make_bucket(name); - last_symbol->next = bp; - last_symbol = bp; - - return (bp); -} - - -create_symbol_table() -{ - register int i; - register bucket *bp; - - symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *)); - if (symbol_table == 0) no_space(); - for (i = 0; i < TABLE_SIZE; i++) - symbol_table[i] = 0; - - bp = make_bucket("error"); - bp->index = 1; - bp->class = TERM; - - first_symbol = bp; - last_symbol = bp; - symbol_table[hash("error")] = bp; -} - - -free_symbol_table() -{ - FREE(symbol_table); - symbol_table = 0; -} - - -free_symbols() -{ - register bucket *p, *q; - - for (p = first_symbol; p; p = q) - { - q = p->next; - FREE(p); - } -} diff --git a/util/byacc/verbose.c b/util/byacc/verbose.c deleted file mode 100644 index 2c7cc52c7..000000000 --- a/util/byacc/verbose.c +++ /dev/null @@ -1,329 +0,0 @@ - -#include "defs.h" - - -static short *null_rules; - -verbose() -{ - register int i; - - if (!vflag) return; - - null_rules = (short *) MALLOC(nrules*sizeof(short)); - if (null_rules == 0) no_space(); - fprintf(verbose_file, "\f\n"); - for (i = 0; i < nstates; i++) - print_state(i); - FREE(null_rules); - - if (nunused) - log_unused(); - if (SRtotal || RRtotal) - log_conflicts(); - - fprintf(verbose_file, "\n\n%d terminals, %d nonterminals\n", ntokens, - nvars); - fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2, nstates); -} - - -log_unused() -{ - register int i; - register short *p; - - fprintf(verbose_file, "\n\nRules never reduced:\n"); - for (i = 3; i < nrules; ++i) - { - if (!rules_used[i]) - { - fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]); - for (p = ritem + rrhs[i]; *p >= 0; ++p) - fprintf(verbose_file, " %s", symbol_name[*p]); - fprintf(verbose_file, " (%d)\n", i - 2); - } - } -} - - -log_conflicts() -{ - register int i; - - fprintf(verbose_file, "\n\n"); - for (i = 0; i < nstates; i++) - { - if (SRconflicts[i] || RRconflicts[i]) - { - fprintf(verbose_file, "State %d contains ", i); - if (SRconflicts[i] == 1) - fprintf(verbose_file, "1 shift/reduce conflict"); - else if (SRconflicts[i] > 1) - fprintf(verbose_file, "%d shift/reduce conflicts", - SRconflicts[i]); - if (SRconflicts[i] && RRconflicts[i]) - fprintf(verbose_file, ", "); - if (RRconflicts[i] == 1) - fprintf(verbose_file, "1 reduce/reduce conflict"); - else if (RRconflicts[i] > 1) - fprintf(verbose_file, "%d reduce/reduce conflicts", - RRconflicts[i]); - fprintf(verbose_file, ".\n"); - } - } -} - - -print_state(state) -int state; -{ - if (state) - fprintf(verbose_file, "\n\n"); - if (SRconflicts[state] || RRconflicts[state]) - print_conflicts(state); - fprintf(verbose_file, "state %d\n", state); - print_core(state); - print_nulls(state); - print_actions(state); -} - - -print_conflicts(state) -int state; -{ - register int symbol, act, number; - register action *p; - - symbol = -1; - for (p = parser[state]; p; p = p->next) - { - if (p->suppressed == 2) - continue; - - if (p->symbol != symbol) - { - symbol = p->symbol; - number = p->number; - if (p->action_code == SHIFT) - act = SHIFT; - else - act = REDUCE; - } - else if (p->suppressed == 1) - { - if (state == final_state && symbol == 0) - { - fprintf(verbose_file, "%d: shift/reduce conflict \ -(accept, reduce %d) on $end\n", state, p->number - 2); - } - else - { - if (act == SHIFT) - { - fprintf(verbose_file, "%d: shift/reduce conflict \ -(shift %d, reduce %d) on %s\n", state, number, p->number - 2, - symbol_name[symbol]); - } - else - { - fprintf(verbose_file, "%d: reduce/reduce conflict \ -(reduce %d, reduce %d) on %s\n", state, number - 2, p->number - 2, - symbol_name[symbol]); - } - } - } - } -} - - -print_core(state) -int state; -{ - register int i; - register int k; - register int rule; - register core *statep; - register short *sp; - register short *sp1; - - statep = state_table[state]; - k = statep->nitems; - - for (i = 0; i < k; i++) - { - sp1 = sp = ritem + statep->items[i]; - - while (*sp >= 0) ++sp; - rule = -(*sp); - fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]); - - for (sp = ritem + rrhs[rule]; sp < sp1; sp++) - fprintf(verbose_file, "%s ", symbol_name[*sp]); - - putc('.', verbose_file); - - while (*sp >= 0) - { - fprintf(verbose_file, " %s", symbol_name[*sp]); - sp++; - } - fprintf(verbose_file, " (%d)\n", -2 - *sp); - } -} - - -print_nulls(state) -int state; -{ - register action *p; - register int i, j, k, nnulls; - - nnulls = 0; - for (p = parser[state]; p; p = p->next) - { - if (p->action_code == REDUCE && - (p->suppressed == 0 || p->suppressed == 1)) - { - i = p->number; - if (rrhs[i] + 1 == rrhs[i+1]) - { - for (j = 0; j < nnulls && i > null_rules[j]; ++j) - continue; - - if (j == nnulls) - { - ++nnulls; - null_rules[j] = i; - } - else if (i != null_rules[j]) - { - ++nnulls; - for (k = nnulls - 1; k > j; --k) - null_rules[k] = null_rules[k-1]; - null_rules[j] = i; - } - } - } - } - - for (i = 0; i < nnulls; ++i) - { - j = null_rules[i]; - fprintf(verbose_file, "\t%s : . (%d)\n", symbol_name[rlhs[j]], - j - 2); - } - fprintf(verbose_file, "\n"); -} - - -print_actions(stateno) -int stateno; -{ - register action *p; - register shifts *sp; - register int as; - - if (stateno == final_state) - fprintf(verbose_file, "\t$end accept\n"); - - p = parser[stateno]; - if (p) - { - print_shifts(p); - print_reductions(p, defred[stateno]); - } - - sp = shift_table[stateno]; - if (sp && sp->nshifts > 0) - { - as = accessing_symbol[sp->shift[sp->nshifts - 1]]; - if (ISVAR(as)) - print_gotos(stateno); - } -} - - -print_shifts(p) -register action *p; -{ - register int count; - register action *q; - - count = 0; - for (q = p; q; q = q->next) - { - if (q->suppressed < 2 && q->action_code == SHIFT) - ++count; - } - - if (count > 0) - { - for (; p; p = p->next) - { - if (p->action_code == SHIFT && p->suppressed == 0) - fprintf(verbose_file, "\t%s shift %d\n", - symbol_name[p->symbol], p->number); - } - } -} - - -print_reductions(p, defred) -register action *p; -register int defred; -{ - register int k, anyreds; - register action *q; - - anyreds = 0; - for (q = p; q ; q = q->next) - { - if (q->action_code == REDUCE && q->suppressed < 2) - { - anyreds = 1; - break; - } - } - - if (anyreds == 0) - fprintf(verbose_file, "\t. error\n"); - else - { - for (; p; p = p->next) - { - if (p->action_code == REDUCE && p->number != defred) - { - k = p->number - 2; - if (p->suppressed == 0) - fprintf(verbose_file, "\t%s reduce %d\n", - symbol_name[p->symbol], k); - } - } - - if (defred > 0) - fprintf(verbose_file, "\t. reduce %d\n", defred - 2); - } -} - - -print_gotos(stateno) -int stateno; -{ - register int i, k; - register int as; - register short *to_state; - register shifts *sp; - - putc('\n', verbose_file); - sp = shift_table[stateno]; - to_state = sp->shift; - for (i = 0; i < sp->nshifts; ++i) - { - k = to_state[i]; - as = accessing_symbol[k]; - if (ISVAR(as)) - fprintf(verbose_file, "\t%s goto %d\n", symbol_name[as], k); - } -} - diff --git a/util/byacc/warshall.c b/util/byacc/warshall.c deleted file mode 100644 index 4d22ad741..000000000 --- a/util/byacc/warshall.c +++ /dev/null @@ -1,84 +0,0 @@ -#include "defs.h" - -transitive_closure(R, n) -unsigned *R; -int n; -{ - register int rowsize; - register unsigned mask; - register unsigned *rowj; - register unsigned *rp; - register unsigned *rend; - register unsigned *ccol; - register unsigned *relend; - register unsigned *cword; - register unsigned *rowi; - - rowsize = WORDSIZE(n); - relend = R + n*rowsize; - - cword = R; - mask = 1; - rowi = R; - while (rowi < relend) - { - ccol = cword; - rowj = R; - - while (rowj < relend) - { - if (*ccol & mask) - { - rp = rowi; - rend = rowj + rowsize; - while (rowj < rend) - *rowj++ |= *rp++; - } - else - { - rowj += rowsize; - } - - ccol += rowsize; - } - - mask <<= 1; - if (mask == 0) - { - mask = 1; - cword++; - } - - rowi += rowsize; - } -} - -reflexive_transitive_closure(R, n) -unsigned *R; -int n; -{ - register int rowsize; - register unsigned mask; - register unsigned *rp; - register unsigned *relend; - - transitive_closure(R, n); - - rowsize = WORDSIZE(n); - relend = R + n*rowsize; - - mask = 1; - rp = R; - while (rp < relend) - { - *rp |= mask; - mask <<= 1; - if (mask == 0) - { - mask = 1; - rp++; - } - - rp += rowsize; - } -} diff --git a/util/cgg/build.lua b/util/cgg/build.lua index 00ae59719..186583d5c 100644 --- a/util/cgg/build.lua +++ b/util/cgg/build.lua @@ -1,6 +1,6 @@ -include("first/yacc.lua") +include("first/bison.lua") -local cggparser = yacc { +local cggparser = bison { name = "cggparser", srcs = { "./bootgram.y" } } @@ -13,7 +13,7 @@ local cgglexer = flex { cprogram { name = "cgg", srcs = concat( - "./*.c", + "./main.c", matching(filenamesof(cggparser), "%.c$"), matching(filenamesof(cgglexer), "%.c$") ), diff --git a/util/cmisc/build.lua b/util/cmisc/build.lua index f0278a503..d1767959e 100644 --- a/util/cmisc/build.lua +++ b/util/cmisc/build.lua @@ -24,11 +24,6 @@ definerule("tabgen", end ) -cprogram { - name = "ed", - srcs = { "./ed.c" } -} - cprogram { name = "objectify", srcs = { "./objectify.c" } diff --git a/util/cmisc/ed.c b/util/cmisc/ed.c deleted file mode 100644 index ab2407dc8..000000000 --- a/util/cmisc/ed.c +++ /dev/null @@ -1,2199 +0,0 @@ -/* Copyright 1987 Brian Beattie Rights Reserved. - * - * Permission to copy and/or distribute granted under the - * following conditions: - * - * 1). No charge may be made other than resonable charges - * for reproduction. - * - * 2). This notice must remain intact. - * - * 3). No further restrictions may be added. - * - */ - -/* This program used to be in many little pieces, with this makefile: -.SUFFIXES: .c .s - -CFLAGS = -F - -OBJS = append.s catsub.s ckglob.s deflt.s del.s docmd.s doglob.s\ - doprnt.s doread.s dowrite.s ed.s egets.s find.s getfn.s getlst.s\ - getnum.s getone.s getptr.s getrhs.s gettxt.s ins.s join.s maksub.s\ - move.s optpat.s set.s setbuf.s subst.s getpat.s matchs.s amatch.s\ - unmkpat.s omatch.s makepat.s bitmap.s dodash.s esc.s System.s - -ed: $(OBJS) - cc -T. -i -o ed $(OBJS) -*/ - -#include -#include -#include -#include -#include -#include -#include - -/****************************/ - -/* tools.h */ -/* - * #defines for non-printing ASCII characters - */ - -#define NUL 0x00 /* ^@ */ -#define EOS 0x00 /* end of string */ -#define SOH 0x01 /* ^A */ -#define STX 0x02 /* ^B */ -#define ETX 0x03 /* ^C */ -#define EOT 0x04 /* ^D */ -#define ENQ 0x05 /* ^E */ -#define ACK 0x06 /* ^F */ -#define BEL 0x07 /* ^G */ -#define BS 0x08 /* ^H */ -#define HT 0x09 /* ^I */ -#define LF 0x0a /* ^J */ -#define NL '\n' -#define VT 0x0b /* ^K */ -#define FF 0x0c /* ^L */ -#define CR 0x0d /* ^M */ -#define SO 0x0e /* ^N */ -#define SI 0x0f /* ^O */ -#define DLE 0x10 /* ^P */ -#define DC1 0x11 /* ^Q */ -#define DC2 0x12 /* ^R */ -#define DC3 0x13 /* ^S */ -#define DC4 0x14 /* ^T */ -#define NAK 0x15 /* ^U */ -#define SYN 0x16 /* ^V */ -#define ETB 0x17 /* ^W */ -#define CAN 0x18 /* ^X */ -#define EM 0x19 /* ^Y */ -#define SUB 0x1a /* ^Z */ -#define ESC 0x1b /* ^[ */ -#define FS 0x1c /* ^\ */ -#define GS 0x1d /* ^] */ -#define RS 0x1e /* ^^ */ -#define US 0x1f /* ^_ */ -#define SP 0x20 /* space */ -#define DEL 0x7f /* DEL */ - - -#define TRUE 1 -#define FALSE 0 -#define ERR -2 - - -/* Definitions of meta-characters used in pattern matching - * routines. LITCHAR & NCCL are only used as token identifiers; - * all the others are also both token identifier and actual symbol - * used in the regular expression. - */ - - -#define BOL '^' -#define EOL '$' -#define ANY '.' -#define LITCHAR 'L' -#define ESCAPE '\\' -#define CCL '[' /* Character class: [...] */ -#define CCLEND ']' -#define NEGATE '^' -#define NCCL '!' /* Negative character class [^...] */ -#define CLOSURE '*' -#define OR_SYM '|' -#define DITTO '&' -#define OPEN '(' -#define CLOSE ')' - -/* Largest permitted size for an expanded character class. (i.e. the class - * [a-z] will expand into 26 symbols; [a-z0-9] will expand into 36.) - */ -#define CLS_SIZE 128 - -/* - * Tokens are used to hold pattern templates. (see makepat()) - */ -typedef char BITMAP; - -typedef struct token { - char tok; - char lchar; - BITMAP *bitmap; - struct token *next; -} TOKEN; - -#define TOKSIZE sizeof (TOKEN) - -/* - * An absolute maximun for strings. - */ - -#define MAXSTR 132 /* Maximum numbers of characters in a line */ - - -/* Macros */ -#define max(a,b) ((a>b)?a:b) -#define min(a,b) ((a='a'&&c<='z'?c-32:c) - -/* ed.h */ -#define FATAL (ERR-1) -struct line { - int l_stat; /* empty, mark */ - struct line *l_prev; - struct line *l_next; - char l_buff[1]; -}; - -typedef struct line LINE; - -#define LINFREE 1 /* entry not in use */ -#define LGLOB 2 /* line marked global */ - - /* max number of chars per line */ -#define MAXLINE (sizeof(int) == 2 ? 256 : 8192) -#define MAXPAT 256 /* max number of chars per replacement - * pattern */ - /* max file name size */ -#define MAXFNAME (sizeof(int) == 2 ? 256 : 1024) - -extern LINE line0; -extern int curln, lastln, line1, line2, nlines; -extern int nflg; /* print line number flag */ -extern int lflg; /* print line in verbose mode */ -extern char *inptr; /* tty input buffer */ -extern char linbuf[], *linptr; /* current line */ -extern int truncflg; /* truncate long line flag */ -extern int eightbit; /* save eighth bit */ -extern int nonascii; /* count of non-ascii chars read */ -extern int nullchar; /* count of null chars read */ -extern int truncated; /* count of lines truncated */ -extern int fchanged; /* file changed */ - -#define nextln(l) ((l)+1 > lastln ? 0 : (l)+1) -#define prevln(l) ((l)-1 < 0 ? lastln : (l)-1) - -/* amatch.c */ -/* #include */ -/* #include "tools.h" */ - -#define _PROTOTYPE(a, b) a b -_PROTOTYPE(int main, (int argc, char **argv)); -_PROTOTYPE(static char *match, (char *lin, TOKEN *pat, char *boln)); -_PROTOTYPE(char *amatch, (char *lin, TOKEN *pat, char *boln)); -_PROTOTYPE(int append, (int line, int glob)); -_PROTOTYPE(BITMAP *makebitmap, (unsigned size)); -_PROTOTYPE(int setbit, (unsigned c, char *map, unsigned val)); -_PROTOTYPE(int testbit, (unsigned c, char *map)); -_PROTOTYPE(char *catsub, (char *from, char *to, char *sub, char *new, char *newend)); -_PROTOTYPE(int ckglob, (void)); -_PROTOTYPE(int deflt, (int def1, int def2)); -_PROTOTYPE(int del, (int from, int to)); -_PROTOTYPE(int docmd, (int glob)); -_PROTOTYPE(int dolst, (int line1, int line2)); -_PROTOTYPE(char *dodash, (int delim, char *src, char *map)); -_PROTOTYPE(int doglob, (void)); -_PROTOTYPE(int doprnt, (int from, int to)); -_PROTOTYPE(void prntln, (char *str, int vflg, int lin)); -_PROTOTYPE(void putcntl, (int c, FILE *stream)); -_PROTOTYPE(int doread, (int lin, char *fname)); -_PROTOTYPE(int dowrite, (int from, int to, char *fname, int apflg)); -_PROTOTYPE(void intr, (int sig)); -_PROTOTYPE(int egets, (char *str, int size, FILE *stream)); -_PROTOTYPE(int esc, (char **s)); -_PROTOTYPE(int find, (TOKEN *pat, int dir)); -_PROTOTYPE(char *getfn, (void)); -_PROTOTYPE(int getlst, (void)); -_PROTOTYPE(int getnum, (int first)); -_PROTOTYPE(int getone, (void)); -_PROTOTYPE(TOKEN *getpat, (char *arg)); -_PROTOTYPE(LINE *getptr, (int num)); -_PROTOTYPE(int getrhs, (char *sub)); -_PROTOTYPE(char *gettxt, (int num)); -_PROTOTYPE(int ins, (char *str)); -_PROTOTYPE(int System, (char *c)); -_PROTOTYPE(int join, (int first, int last)); -_PROTOTYPE(TOKEN *makepat, (char *arg, int delim)); -_PROTOTYPE(char *maksub, (char *sub, int subsz)); -_PROTOTYPE(char *matchs, (char *line, TOKEN *pat, int ret_endp)); -_PROTOTYPE(int move, (int num)); -_PROTOTYPE(int transfer, (int num)); -_PROTOTYPE(int omatch, (char **linp, TOKEN *pat, char *boln)); -_PROTOTYPE(TOKEN *optpat, (void)); -_PROTOTYPE(int set, (void)); -_PROTOTYPE(int show, (void)); -_PROTOTYPE(void relink, (LINE *a, LINE *x, LINE *y, LINE *b)); -_PROTOTYPE(void clrbuf, (void)); -_PROTOTYPE(void set_buf, (void)); -_PROTOTYPE(int subst, (TOKEN *pat, char *sub, int gflg, int pflag)); -_PROTOTYPE(void unmakepat, (TOKEN *head)); - -/* Scans throught the pattern template looking for a match - * with lin. Each element of lin is compared with the template - * until either a mis-match is found or the end of the template - * is reached. In the former case a 0 is returned; in the latter, - * a pointer into lin (pointing to the character following the - * matched pattern) is returned. - * - * "lin" is a pointer to the line being searched. - * "pat" is a pointer to a template made by makepat(). - * "boln" is a pointer into "lin" which points at the - * character at the beginning of the line. - */ - -char *paropen[9], *parclose[9]; -int between, parnum; - -char *amatch(lin, pat, boln) -char *lin; -TOKEN *pat; -char *boln; -{ - between = 0; - parnum = 0; - - lin = match(lin, pat, boln); - - if (between) return 0; - - while (parnum < 9) { - paropen[parnum] = parclose[parnum] = ""; - parnum++; - } - return lin; -} - -static char *match(lin, pat, boln) -char *lin; -TOKEN *pat; -char *boln; -{ - register char *bocl, *rval, *strstart; - - if (pat == 0) return 0; - - strstart = lin; - - while (pat) { - if (pat->tok == CLOSURE && pat->next) { - /* Process a closure: first skip over the closure - * token to the object to be repeated. This object - * can be a character class. */ - - pat = pat->next; - - /* Now match as many occurrences of the closure - * pattern as possible. */ - bocl = lin; - - while (*lin && omatch(&lin, pat, boln)); - - /* 'Lin' now points to the character that made made - * us fail. Now go on to process the rest of the - * string. A problem here is a character following - * the closure which could have been in the closure. - * For example, in the pattern "[a-z]*t" (which - * matches any lower-case word ending in a t), the - * final 't' will be sucked up in the while loop. - * So, if the match fails, we back up a notch and try - * to match the rest of the string again, repeating - * this process recursively until we get back to the - * beginning of the closure. The recursion goes, at - * most two levels deep. */ - - if (pat = pat->next) { - int savbtwn = between; - int savprnm = parnum; - - while (bocl <= lin) { - if (rval = match(lin, pat, boln)) { - /* Success */ - return(rval); - } else { - --lin; - between = savbtwn; - parnum = savprnm; - } - } - return(0); /* match failed */ - } - } else if (pat->tok == OPEN) { - if (between || parnum >= 9) return 0; - paropen[parnum] = lin; - between = 1; - pat = pat->next; - } else if (pat->tok == CLOSE) { - if (!between) return 0; - parclose[parnum++] = lin; - between = 0; - pat = pat->next; - } else if (omatch(&lin, pat, boln)) { - pat = pat->next; - } else { - return(0); - } - } - - /* Note that omatch() advances lin to point at the next character to - * be matched. Consequently, when we reach the end of the template, - * lin will be pointing at the character following the last character - * matched. The exceptions are templates containing only a BOLN or - * EOLN token. In these cases omatch doesn't advance. - * - * A philosophical point should be mentioned here. Is $ a position or a - * character? (i.e. does $ mean the EOL character itself or does it - * mean the character at the end of the line.) I decided here to - * make it mean the former, in order to make the behavior of match() - * consistent. If you give match the pattern ^$ (match all lines - * consisting only of an end of line) then, since something has to be - * returned, a pointer to the end of line character itself is - * returned. */ - - return((char *) max(strstart, lin)); -} - -/* append.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int append(line, glob) -int line, glob; -{ - int stat; - char lin[MAXLINE]; - - if (glob) return(ERR); - curln = line; - while (1) { - if (nflg) printf("%6d. ", curln + 1); - - if (fgets(lin, MAXLINE, stdin) == NULL) return(EOF); - if (lin[0] == '.' && lin[1] == '\n') return (0); - stat = ins(lin); - if (stat < 0) return(ERR); - - } -} - -/* bitmap.c */ -/* - * BITMAP.C - makebitmap, setbit, testbit - * bit-map manipulation routines. - * - * Copyright (c) Allen I. Holub, all rights reserved. This program may - * for copied for personal, non-profit use only. - * - */ - -#ifdef DEBUG -/* #include */ -#endif - -/* #include "tools.h" */ - - -BITMAP *makebitmap(size) -unsigned size; -{ - /* Make a bit map with "size" bits. The first entry in the map is an - * "unsigned int" representing the maximum bit. The map itself is - * concatenated to this integer. Return a pointer to a map on - * success, 0 if there's not enough memory. */ - - unsigned *map, numbytes; - - numbytes = (size >> 3) + ((size & 0x07) ? 1 : 0); - -#ifdef DEBUG - printf("Making a %d bit map (%d bytes required)\n", size, numbytes); -#endif - - if (map = (unsigned *) malloc(numbytes + sizeof(unsigned))) { - *map = size; - memset(map + 1, 0, numbytes); - } - - return((BITMAP *) map); -} - -int setbit(c, map, val) -unsigned c, val; -char *map; -{ - /* Set bit c in the map to val. If c > map-size, 0 is returned, else - * 1 is returned. */ - - if (c >= *(unsigned *) map) /* if c >= map size */ - return 0; - - map += sizeof(unsigned); /* skip past size */ - - if (val) - map[c >> 3] |= 1 << (c & 0x07); - else - map[c >> 3] &= ~(1 << (c & 0x07)); - - return 1; -} - -int testbit(c, map) -unsigned c; -char *map; -{ - /* Return 1 if the bit corresponding to c in map is set. 0 if it is not. */ - - if (c >= *(unsigned *) map) return 0; - - map += sizeof(unsigned); - - return(map[c >> 3] & (1 << (c & 0x07))); -} - -/* catsub.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -extern char *paropen[9], *parclose[9]; - -char *catsub(from, to, sub, new, newend) -char *from, *to, *sub, *new, *newend; -{ - char *cp, *cp2; - - for (cp = new; *sub != EOS && cp < newend;) { - if (*sub == DITTO) for (cp2 = from; cp2 < to;) { - *cp++ = *cp2++; - if (cp >= newend) break; - } - else if (*sub == ESCAPE) { - sub++; - if ('1' <= *sub && *sub <= '9') { - char *parcl = parclose[*sub - '1']; - - for (cp2 = paropen[*sub - '1']; cp2 < parcl;) { - *cp++ = *cp2++; - if (cp >= newend) break; - } - } else - *cp++ = *sub; - } else - *cp++ = *sub; - - sub++; - } - - return(cp); -} - -/* ckglob.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int ckglob() -{ - TOKEN *glbpat; - char c, delim; - char lin[MAXLINE]; - int num; - LINE *ptr; - - c = *inptr; - - if (c != 'g' && c != 'v') return(0); - - if (deflt(1, lastln) < 0) return(ERR); - - delim = *++inptr; - if (delim <= ' ') return(ERR); - - glbpat = optpat(); - - if (*inptr == delim) inptr++; - - ptr = getptr(1); - for (num = 1; num <= lastln; num++) { - ptr->l_stat &= ~LGLOB; - if (line1 <= num && num <= line2) { - strcpy(lin, ptr->l_buff); - strcat(lin, "\n"); - if (matchs(lin, glbpat, 0)) { - if (c == 'g') ptr->l_stat |= LGLOB; - } else { - if (c == 'v') ptr->l_stat |= LGLOB; - } - } - ptr = ptr->l_next; - } - return(1); -} - -/* deflt.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int deflt(def1, def2) -int def1, def2; -{ - if (nlines == 0) { - line1 = def1; - line2 = def2; - } - if (line1 > line2 || line1 <= 0) return(ERR); - return(0); -} - -/* del.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int del(from, to) -int from, to; -{ - LINE *first, *last, *next, *tmp; - - if (from < 1) from = 1; - first = getptr(prevln(from)); - last = getptr(nextln(to)); - next = first->l_next; - while (next != last && next != &line0) { - tmp = next->l_next; - free((char *) next); - next = tmp; - } - relink(first, last, first, last); - lastln -= (to - from) + 1; - curln = prevln(from); - return(0); -} - -/* docmd.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -char fname[MAXFNAME]; -int fchanged; -extern int nofname; - -extern int mark[]; - -int docmd(glob) -int glob; -{ - static char rhs[MAXPAT]; - TOKEN *subpat; - int c, err, line3; - int apflg, pflag, gflag; - int nchng; - char *fptr; - - pflag = FALSE; - while (*inptr == SP || *inptr == HT) inptr++; - - c = *inptr++; - - switch (c) { - case NL: - if (nlines == 0) { - if ((line2 = nextln(curln)) == 0) return(ERR); - } - curln = line2; - return(1); - break; - - case '=': printf("%d\n", line2); break; - - case 'a': - if (*inptr != NL || nlines > 1) return(ERR); - - if (append(line1, glob) < 0) return(ERR);; - fchanged = TRUE; - break; - - case 'c': - if (*inptr != NL) return(ERR); - - if (deflt(curln, curln) < 0) return(ERR); - - if (del(line1, line2) < 0) return(ERR); - if (append(curln, glob) < 0) return (ERR); - fchanged = TRUE; - break; - - case 'd': - if (*inptr != NL) return(ERR); - - if (deflt(curln, curln) < 0) return(ERR); - - if (del(line1, line2) < 0) return(ERR); - if (nextln(curln) != 0) curln = nextln(curln); - fchanged = TRUE; - break; - - case 'e': - if (nlines > 0) return(ERR); - if (fchanged) { - fchanged = FALSE; - return(ERR); - } - - /* FALL THROUGH */ - case 'E': - if (nlines > 0) return(ERR); - - if (*inptr != ' ' && *inptr != HT && *inptr != NL) return(ERR); - - if ((fptr = getfn()) == NULL) return(ERR); - - clrbuf(); - if ((err = doread(0, fptr)) < 0) return(err); - - strcpy(fname, fptr); - fchanged = FALSE; - break; - - case 'f': - if (nlines > 0) return(ERR); - - if (*inptr != ' ' && *inptr != HT && *inptr != NL) return(ERR); - - if ((fptr = getfn()) == NULL) return(ERR); - - if (nofname) - printf("%s\n", fname); - else - strcpy(fname, fptr); - break; - - case 'i': - if (*inptr != NL || nlines > 1) return(ERR); - - if (append(prevln(line1), glob) < 0) return(ERR); - fchanged = TRUE; - break; - - case 'j': - if (*inptr != NL || deflt(curln, curln + 1) < 0) return(ERR); - - if (join(line1, line2) < 0) return(ERR); - break; - - case 'k': - while (*inptr == ' ' || *inptr == HT) inptr++; - - if (*inptr < 'a' || *inptr > 'z') return ERR; - c = *inptr++; - - if (*inptr != ' ' && *inptr != HT && *inptr != NL) return(ERR); - - mark[c - 'a'] = line1; - break; - - case 'l': - if (*inptr != NL) return(ERR); - if (deflt(curln, curln) < 0) return (ERR); - if (dolst(line1, line2) < 0) return (ERR); - break; - - case 'm': - if ((line3 = getone()) < 0) return(ERR); - if (deflt(curln, curln) < 0) return (ERR); - if (move(line3) < 0) return (ERR); - fchanged = TRUE; - break; - - case 'P': - case 'p': - if (*inptr != NL) return(ERR); - if (deflt(curln, curln) < 0) return (ERR); - if (doprnt(line1, line2) < 0) return (ERR); - break; - - case 'q': - if (fchanged) { - fchanged = FALSE; - return(ERR); - } - - /* FALL THROUGH */ - case 'Q': - if (*inptr == NL && nlines == 0 && !glob) - return(EOF); - else - return(ERR); - - case 'r': - if (nlines > 1) return(ERR); - - if (nlines == 0) line2 = lastln; - - if (*inptr != ' ' && *inptr != HT && *inptr != NL) return(ERR); - - if ((fptr = getfn()) == NULL) return(ERR); - - if ((err = doread(line2, fptr)) < 0) return(err); - fchanged = TRUE; - break; - - case 's': - if (*inptr == 'e') return(set()); - while (*inptr == SP || *inptr == HT) inptr++; - if ((subpat = optpat()) == NULL) return (ERR); - if ((gflag = getrhs(rhs)) < 0) return (ERR); - if (*inptr == 'p') pflag++; - if (deflt(curln, curln) < 0) return (ERR); - if ((nchng = subst(subpat, rhs, gflag, pflag)) < 0) return (ERR); - if (nchng) fchanged = TRUE; - break; - - case 't': - if ((line3 = getone()) < 0) return(ERR); - if (deflt(curln, curln) < 0) return (ERR); - if (transfer(line3) < 0) return (ERR); - fchanged = TRUE; - break; - - case 'W': - case 'w': - apflg = (c == 'W'); - - if (*inptr != ' ' && *inptr != HT && *inptr != NL) return(ERR); - - if ((fptr = getfn()) == NULL) return(ERR); - - if (deflt(1, lastln) < 0) return(ERR); - if (dowrite(line1, line2, fptr, apflg) < 0) return (ERR); - fchanged = FALSE; - break; - - case 'x': - if (*inptr == NL && nlines == 0 && !glob) { - if ((fptr = getfn()) == NULL) return(ERR); - if (dowrite(1, lastln, fptr, 0) >= 0) return (EOF); - } - return(ERR); - - case 'z': - if (deflt(curln, curln) < 0) return(ERR); - - switch (*inptr) { - case '-': - if (doprnt(line1 - 21, line1) < 0) return(ERR); - break; - - case '.': - if (doprnt(line1 - 11, line1 + 10) < 0) return(ERR); - break; - - case '+': - case '\n': - if (doprnt(line1, line1 + 21) < 0) return(ERR); - break; - } - break; - - default: return(ERR); -} - return(0); -} - -int dolst(line1, line2) -int line1, line2; -{ - int oldlflg = lflg, p; - - lflg = 1; - p = doprnt(line1, line2); - lflg = oldlflg; - - return p; -} - -/* dodash.c */ -/* #include */ -/* #include "tools.h" */ - -/* Expand the set pointed to by *src into dest. - * Stop at delim. Return 0 on error or size of - * character class on success. Update *src to - * point at delim. A set can have one element - * {x} or several elements ( {abcdefghijklmnopqrstuvwxyz} - * and {a-z} are equivalent ). Note that the dash - * notation is expanded as sequential numbers. - * This means (since we are using the ASCII character - * set) that a-Z will contain the entire alphabet - * plus the symbols: [\]^_`. The maximum number of - * characters in a character class is defined by maxccl. - */ -char *dodash(delim, src, map) -int delim; -char *src, *map; -{ - - register int first, last; - char *start; - - start = src; - - while (*src && *src != delim) { - if (*src != '-') setbit(esc(&src), map, 1); - - else if (src == start || *(src + 1) == delim) - setbit('-', map, 1); - else { - src++; - - if (*src < *(src - 2)) { - first = *src; - last = *(src - 2); - } else { - first = *(src - 2); - last = *src; - } - - while (++first <= last) setbit(first, map, 1); - - } - src++; - } - return(src); -} - -/* doglob.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int doglob() -{ - int lin, stat; - char *cmd; - LINE *ptr; - - cmd = inptr; - - while (1) { - ptr = getptr(1); - for (lin = 1; lin <= lastln; lin++) { - if (ptr->l_stat & LGLOB) break; - ptr = ptr->l_next; - } - if (lin > lastln) break; - - ptr->l_stat &= ~LGLOB; - curln = lin; - inptr = cmd; - if ((stat = getlst()) < 0) return(stat); - if ((stat = docmd(1)) < 0) return (stat); - } - return(curln); -} - -/* doprnt.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int doprnt(from, to) -int from, to; -{ - int i; - LINE *lptr; - - from = from < 1 ? 1 : from; - to = to > lastln ? lastln : to; - - if (to != 0) { - lptr = getptr(from); - for (i = from; i <= to; i++) { - prntln(lptr->l_buff, lflg, (nflg ? i : 0)); - lptr = lptr->l_next; - } - curln = to; - } - return(0); -} - -void prntln(str, vflg, lin) -char *str; -int vflg, lin; -{ - if (lin) printf("%7d ", lin); - while (*str && *str != NL) { - if (*str < ' ' || *str >= 0x7f) { - switch (*str) { - case '\t': - if (vflg) - putcntl(*str, stdout); - else - putc(*str, stdout); - break; - - case DEL: - putc('^', stdout); - putc('?', stdout); - break; - - default: - putcntl(*str, stdout); - break; - } - } else - putc(*str, stdout); - str++; - } - if (vflg) putc('$', stdout); - putc('\n', stdout); -} - -void putcntl(c, stream) -char c; -FILE *stream; -{ - putc('^', stream); - putc((c & 31) | '@', stream); -} - -/* doread.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -extern int diag; - -int doread(lin, fname) -int lin; -char *fname; -{ - FILE *fp; - int err; - long bytes; - int lines; - static char str[MAXLINE]; - - err = 0; - nonascii = nullchar = truncated = 0; - - if (diag) printf("\"%s\" ", fname); - if ((fp = fopen(fname, "r")) == NULL) { - printf("file open err\n"); - return(ERR); - } - curln = lin; - for (lines = 0, bytes = 0; (err = egets(str, MAXLINE, fp)) > 0;) { - bytes += strlen(str); - if (ins(str) < 0) { - printf("file insert error\n"); - err++; - break; - } - lines++; - } - fclose(fp); - if (err < 0) return(err); - if (diag) { - printf("%d lines %ld bytes", lines, bytes); - if (nonascii) printf(" [%d non-ascii]", nonascii); - if (nullchar) printf(" [%d nul]", nullchar); - if (truncated) printf(" [%d lines truncated]", truncated); - printf("\n"); - } - return(err); -} - -/* dowrite.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int dowrite(from, to, fname, apflg) -int from, to; -char *fname; -int apflg; -{ - FILE *fp; - int lin, err; - int lines; - long bytes; - char *str; - LINE *lptr; - - err = 0; - - lines = bytes = 0; - if (diag) printf("\"%s\" ", fname); - if ((fp = fopen(fname, (apflg ? "a" : "w"))) == NULL) { - printf("file open error\n"); - return(ERR); - } - lptr = getptr(from); - for (lin = from; lin <= to; lin++) { - str = lptr->l_buff; - lines++; - bytes += strlen(str) + 1; - if (fputs(str, fp) == EOF) { - printf("file write error\n"); - err++; - break; - } - fputc('\n', fp); - lptr = lptr->l_next; - } - if (diag) printf("%d lines %ld bytes\n", lines, bytes); - fclose(fp); - return(err); -} - -/* ed.c */ -/* Copyright 1987 Brian Beattie Rights Reserved. - * - * Permission to copy and/or distribute granted under the - * following conditions: - * - * 1). No charge may be made other than resonable charges - * for reproduction. - * - * 2). This notice must remain intact. - * - * 3). No further restrictions may be added. - * - */ -/* #include */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ -#include -jmp_buf env; - -LINE line0; -int curln = 0; -int lastln = 0; -char *inptr; -static char inlin[MAXLINE]; -int nflg, lflg; -int line1, line2, nlines; -extern char fname[]; -int version = 1; -int diag = 1; - -void intr(sig) -int sig; -{ - printf("?\n"); - longjmp(env, 1); -} - -int main(argc, argv) -int argc; -char **argv; -{ - int stat, i, doflush; - - set_buf(); - doflush = isatty(1); - - if (argc > 1 && (strcmp(argv[1], "-") == 0 || strcmp(argv[1], "-s") == 0)) { - diag = 0; - argc--; - argv++; - } - if (argc > 1) { - for (i = 1; i < argc; i++) { - if (doread(0, argv[i]) == 0) { - curln = 1; - strcpy(fname, argv[i]); - break; - } - } - } - while (1) { - setjmp(env); - if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, intr); - - if (doflush) fflush(stdout); - - if (fgets(inlin, sizeof(inlin), stdin) == NULL) { - break; - } - for (;;) { - inptr = strchr(inlin, EOS); - if (inptr >= inlin+2 && inptr[-2] == '\\' && inptr[-1] == NL) { - inptr[-1] = 'n'; - if (fgets(inptr, sizeof(inlin) - (inptr - inlin), - stdin) == NULL) break; - } else { - break; - } - } - if (*inlin == '!') { - if ((inptr = strchr(inlin, NL)) != NULL) *inptr = EOS; - System(inlin + 1); - continue; - } - inptr = inlin; - if (getlst() >= 0) - if ((stat = ckglob()) != 0) { - if (stat >= 0 && (stat = doglob()) >= 0) { - curln = stat; - continue; - } - } else { - if ((stat = docmd(0)) >= 0) { - if (stat == 1) doprnt(curln, curln); - continue; - } - } - if (stat == EOF) { - exit(0); - } - if (stat == FATAL) { - fputs("FATAL ERROR\n", stderr); - exit(1); - } - printf("?\n"); - } - return(0); -} - -/* egets.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int eightbit = 1; /* save eight bit */ -int nonascii, nullchar, truncated; -int egets(str, size, stream) -char *str; -int size; -FILE *stream; -{ - int c, count; - char *cp; - - for (count = 0, cp = str; size > count;) { - c = getc(stream); - if (c == EOF) { - *cp++ = '\n'; - *cp = EOS; - if (count) { - printf("[Incomplete last line]\n"); - } - return(count); - } - if (c == NL) { - *cp++ = c; - *cp = EOS; - return(++count); - } - if (c > 127) { - if (!eightbit) /* if not saving eighth bit */ - c = c & 127; /* strip eigth bit */ - nonascii++; /* count it */ - } - if (c) { - *cp++ = c; /* not null, keep it */ - count++; - } else - nullchar++; /* count nulls */ - } - str[count - 1] = EOS; - if (c != NL) { - printf("truncating line\n"); - truncated++; - while ((c = getc(stream)) != EOF) - if (c == NL) break; - } - return(count); -} - -/* esc.c */ -/* #include */ -/* #include "tools.h" */ - -/* Map escape sequences into their equivalent symbols. Returns the - * correct ASCII character. If no escape prefix is present then s - * is untouched and *s is returned, otherwise **s is advanced to point - * at the escaped character and the translated character is returned. - */ -int esc(s) -char **s; -{ - register int rval; - - - if (**s != ESCAPE) { - rval = **s; - } else { - (*s)++; - - switch (toupper(**s)) { - case '\000': rval = ESCAPE; break; - case 'S': rval = ' '; break; - case 'N': rval = '\n'; break; - case 'T': rval = '\t'; break; - case 'B': rval = '\b'; break; - case 'R': rval = '\r'; break; - default: rval = **s; break; - } - } - - return(rval); -} - -/* find.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int find(pat, dir) -TOKEN *pat; -int dir; -{ - int i, num; - char lin[MAXLINE]; - LINE *ptr; - - num = curln; - ptr = getptr(curln); - num = (dir ? nextln(num) : prevln(num)); - ptr = (dir ? ptr->l_next : ptr->l_prev); - for (i = 0; i < lastln; i++) { - if (num == 0) { - num = (dir ? nextln(num) : prevln(num)); - ptr = (dir ? ptr->l_next : ptr->l_prev); - } - strcpy(lin, ptr->l_buff); - strcat(lin, "\n"); - if (matchs(lin, pat, 0)) { - return(num); - } - num = (dir ? nextln(num) : prevln(num)); - ptr = (dir ? ptr->l_next : ptr->l_prev); - } - return(ERR); -} - -/* getfn.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -extern char fname[MAXFNAME]; -int nofname; - -char *getfn() -{ - static char file[256]; - char *cp; - - if (*inptr == NL) { - nofname = TRUE; - strcpy(file, fname); - } else { - nofname = FALSE; - while (*inptr == SP || *inptr == HT) inptr++; - - cp = file; - while (*inptr && *inptr != NL && *inptr != SP && *inptr != HT) { - *cp++ = *inptr++; - } - *cp = '\0'; - - if (strlen(file) == 0) { - printf("bad file name\n"); - return(NULL); - } - } - - if (strlen(file) == 0) { - printf("no file name\n"); - return(NULL); - } - return(file); -} - -/* getlst.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int getlst() -{ - int num; - - line2 = 0; - for (nlines = 0; (num = getone()) >= 0;) { - line1 = line2; - line2 = num; - nlines++; - if (*inptr != ',' && *inptr != ';') break; - if (*inptr == ';') curln = num; - inptr++; - } - nlines = min(nlines, 2); - if (nlines == 0) line2 = curln; - if (nlines <= 1) line1 = line2; - - if (num == ERR) - return(num); - else - return(nlines); -} - -/* getnum.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int mark['z' - 'a' + 1]; - -int getnum(first) -int first; -{ - TOKEN *srchpat; - int num; - char c; - - while (*inptr == SP || *inptr == HT) inptr++; - - if (*inptr >= '0' && *inptr <= '9') { /* line number */ - for (num = 0; *inptr >= '0' && *inptr <= '9';) { - num = (num * 10) + *inptr - '0'; - inptr++; - } - return num; - } - switch (c = *inptr) { - case '.': - inptr++; - return(curln); - - case '$': - inptr++; - return(lastln); - - case '/': - case '?': - srchpat = optpat(); - if (*inptr == c) inptr++; - return(find(srchpat, c == '/' ? 1 : 0)); - - case '-': - case '+': - return(first ? curln : 1); - - case '\'': - inptr++; - if (*inptr < 'a' || *inptr > 'z') return(EOF); - - return mark[*inptr++ - 'a']; - - default: - return(first ? EOF : 1);/* unknown address */ - } -} - -/* getone.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -#define FIRST 1 -#define NOTFIRST 0 - -int getone() -{ - int c, i, num; - - if ((num = getnum(FIRST)) >= 0) { - while (1) { - while (*inptr == SP || *inptr == HT) inptr++; - - if (*inptr != '+' && *inptr != '-') break; - c = *inptr++; - - if ((i = getnum(NOTFIRST)) < 0) return(i); - - if (c == '+') { - num += i; - } else { - num -= i; - } - } - } - return(num > lastln ? ERR : num); -} - -/* getpat.c */ -/* #include */ -/* #include "tools.h" */ - -/* Translate arg into a TOKEN string */ -TOKEN * - getpat(arg) -char *arg; -{ - - return(makepat(arg, '\000')); -} - -/* getptr.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -LINE * - getptr(num) -int num; -{ - LINE *ptr; - int j; - - if (2 * num > lastln && num <= lastln) { /* high line numbers */ - ptr = line0.l_prev; - for (j = lastln; j > num; j--) ptr = ptr->l_prev; - } else { /* low line numbers */ - ptr = &line0; - for (j = 0; j < num; j++) ptr = ptr->l_next; - } - return(ptr); -} - -/* getrhs.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int getrhs(sub) -char *sub; -{ - if (inptr[0] == NL || inptr[1] == NL) /* check for eol */ - return(ERR); - - if (maksub(sub, MAXPAT) == NULL) return(ERR); - - inptr++; /* skip over delimter */ - while (*inptr == SP || *inptr == HT) inptr++; - if (*inptr == 'g') { - inptr++; - return(1); - } - return(0); -} - -/* gettxt.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -char * - gettxt(num) -int num; -{ - LINE *lin; - static char txtbuf[MAXLINE]; - - lin = getptr(num); - strcpy(txtbuf, lin->l_buff); - strcat(txtbuf, "\n"); - return(txtbuf); -} - -/* ins.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int ins(str) -char *str; -{ - char buf[MAXLINE], *cp; - LINE *new, *cur, *nxt; - - cp = buf; - while (1) { - if ((*cp = *str++) == NL) *cp = EOS; - if (*cp) { - cp++; - continue; - } - if ((new = (LINE *) malloc(sizeof(LINE) + strlen(buf))) == NULL) - return(ERR); /* no memory */ - - new->l_stat = 0; - strcpy(new->l_buff, buf); /* build new line */ - cur = getptr(curln); /* get current line */ - nxt = cur->l_next; /* get next line */ - relink(cur, new, new, nxt); /* add to linked list */ - relink(new, nxt, cur, new); - lastln++; - curln++; - - if (*str == EOS) /* end of line ? */ - return(1); - - cp = buf; - } -} - -/* join.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -extern int fchanged; - -int join(first, last) -int first, last; -{ - char buf[MAXLINE]; - char *cp = buf, *str; - int num; - - if (first <= 0 || first > last || last > lastln) return(ERR); - if (first == last) { - curln = first; - return 0; - } - for (num = first; num <= last; num++) { - str = gettxt(num); - - while (*str != NL && cp < buf + MAXLINE - 1) *cp++ = *str++; - - if (cp == buf + MAXLINE - 1) { - printf("line too long\n"); - return(ERR); - } - } - *cp++ = NL; - *cp = EOS; - del(first, last); - curln = first - 1; - ins(buf); - fchanged = TRUE; - return 0; -} - -/* makepat.c */ -/* #include */ -/* #include "tools.h" */ - -/* Make a pattern template from the strinng pointed to by arg. Stop - * when delim or '\000' or '\n' is found in arg. Return a pointer to - * the pattern template. - * - * The pattern template used here are somewhat different than those - * used in the "Software Tools" book; each token is a structure of - * the form TOKEN (see tools.h). A token consists of an identifier, - * a pointer to a string, a literal character and a pointer to another - * token. This last is 0 if there is no subsequent token. - * - * The one strangeness here is caused (again) by CLOSURE which has - * to be put in front of the previous token. To make this insertion a - * little easier, the 'next' field of the last to point at the chain - * (the one pointed to by 'tail) is made to point at the previous node. - * When we are finished, tail->next is set to 0. - */ -TOKEN * - makepat(arg, delim) -char *arg; -int delim; -{ - TOKEN *head, *tail, *ntok; - int error; - - /* Check for characters that aren't legal at the beginning of a template. */ - - if (*arg == '\0' || *arg == delim || *arg == '\n' || *arg == CLOSURE) - return(0); - - error = 0; - tail = head = NULL; - - while (*arg && *arg != delim && *arg != '\n' && !error) { - ntok = (TOKEN *) malloc(TOKSIZE); - ntok->lchar = '\000'; - ntok->next = 0; - - switch (*arg) { - case ANY: ntok->tok = ANY; break; - - case BOL: - if (head == 0) /* then this is the first symbol */ - ntok->tok = BOL; - else - ntok->tok = LITCHAR; - ntok->lchar = BOL; - break; - - case EOL: - if (*(arg + 1) == delim || *(arg + 1) == '\000' || - *(arg + 1) == '\n') { - ntok->tok = EOL; - } else { - ntok->tok = LITCHAR; - ntok->lchar = EOL; - } - break; - - case CLOSURE: - if (head != 0) { - switch (tail->tok) { - case BOL: - case EOL: - case CLOSURE: - return(0); - - default: - ntok->tok = CLOSURE; - } - } - break; - - case CCL: - - if (*(arg + 1) == NEGATE) { - ntok->tok = NCCL; - arg += 2; - } else { - ntok->tok = CCL; - arg++; - } - - if (ntok->bitmap = makebitmap(CLS_SIZE)) - arg = dodash(CCLEND, arg, ntok->bitmap); - else { - fprintf(stderr, "Not enough memory for pat\n"); - error = 1; - } - break; - - default: - if (*arg == ESCAPE && *(arg + 1) == OPEN) { - ntok->tok = OPEN; - arg++; - } else if (*arg == ESCAPE && *(arg + 1) == CLOSE) { - ntok->tok = CLOSE; - arg++; - } else { - ntok->tok = LITCHAR; - ntok->lchar = esc(&arg); - } - } - - if (error || ntok == 0) { - unmakepat(head); - return(0); - } else if (head == 0) { - /* This is the first node in the chain. */ - - ntok->next = 0; - head = tail = ntok; - } else if (ntok->tok != CLOSURE) { - /* Insert at end of list (after tail) */ - - tail->next = ntok; - ntok->next = tail; - tail = ntok; - } else if (head != tail) { - /* More than one node in the chain. Insert the - * CLOSURE node immediately in front of tail. */ - - (tail->next)->next = ntok; - ntok->next = tail; - } else { - /* Only one node in the chain, Insert the CLOSURE - * node at the head of the linked list. */ - - ntok->next = head; - tail->next = ntok; - head = ntok; - } - arg++; - } - - tail->next = 0; - return(head); -} - -/* maksub.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -char * - maksub(sub, subsz) -char *sub; -int subsz; -{ - int size; - char delim, *cp; - - size = 0; - cp = sub; - - delim = *inptr++; - for (size = 0; *inptr != delim && *inptr != NL && size < subsz; size++) { - if (*inptr == '&') { - *cp++ = DITTO; - inptr++; - } else if ((*cp++ = *inptr++) == ESCAPE) { - if (size >= subsz) return(NULL); - - switch (toupper(*inptr)) { - case NL: *cp++ = ESCAPE; break; - break; - case 'S': - *cp++ = SP; - inptr++; - break; - case 'N': - *cp++ = NL; - inptr++; - break; - case 'T': - *cp++ = HT; - inptr++; - break; - case 'B': - *cp++ = BS; - inptr++; - break; - case 'R': - *cp++ = CR; - inptr++; - break; - case '0':{ - int i = 3; - *cp = 0; - do { - if (*++inptr < '0' || *inptr > '7') - break; - - *cp = (*cp << 3) | (*inptr - '0'); - } while (--i != 0); - cp++; - } break; - default: *cp++ = *inptr++; break; - } - } - } - if (size >= subsz) return(NULL); - - *cp = EOS; - return(sub); -} - -/* matchs.c */ -/* #include */ -/* #include "tools.h" */ - -/* Compares line and pattern. Line is a character string while pat - * is a pattern template made by getpat(). - * Returns: - * 1. A zero if no match was found. - * - * 2. A pointer to the last character satisfing the match - * if ret_endp is non-zero. - * - * 3. A pointer to the beginning of the matched string if - * ret_endp is zero. - * - * e.g.: - * - * matchs ("1234567890", getpat("4[0-9]*7), 0); - * will return a pointer to the '4', while: - * - * matchs ("1234567890", getpat("4[0-9]*7), 1); - * will return a pointer to the '7'. - */ -char * - matchs(line, pat, ret_endp) -char *line; -TOKEN *pat; -int ret_endp; -{ - - char *rval, *bptr; - char *line2; - TOKEN *pat2; - char c; - short ok; - - bptr = line; - - while (*line) { - - if (pat && pat->tok == LITCHAR) { - while (*line) { - pat2 = pat; - line2 = line; - if (*line2 != pat2->lchar) { - c = pat2->lchar; - while (*line2 && *line2 != c) ++line2; - line = line2; - if (*line2 == '\0') break; - } - ok = 1; - ++line2; - pat2 = pat2->next; - while (pat2 && pat2->tok == LITCHAR) { - if (*line2 != pat2->lchar) { - ok = 0; - break; - } - ++line2; - pat2 = pat2->next; - } - if (!pat2) { - if (ret_endp) - return(--line2); - else - return(line); - } else if (ok) - break; - ++line; - } - if (*line == '\0') return(0); - } else { - line2 = line; - pat2 = pat; - } - if ((rval = amatch(line2, pat2, bptr)) == 0) { - if (pat && pat->tok == BOL) break; - line++; - } else { - if (rval > bptr && rval > line) - rval--; /* point to last char matched */ - rval = ret_endp ? rval : line; - break; - } - } - return(rval); -} - -/* move.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int move(num) -int num; -{ - LINE *k0, *k1, *k2, *k3; - - if (line1 <= 0 || line2 < line1 || (line1 <= num && num <= line2)) - return(ERR); - k0 = getptr(prevln(line1)); - k1 = getptr(line1); - k2 = getptr(line2); - k3 = getptr(nextln(line2)); - - relink(k0, k3, k0, k3); - lastln -= line2 - line1 + 1; - - if (num > line1) num -= line2 - line1 + 1; - - curln = num + (line2 - line1 + 1); - - k0 = getptr(num); - k3 = getptr(nextln(num)); - - relink(k0, k1, k2, k3); - relink(k2, k3, k0, k1); - lastln += line2 - line1 + 1; - - return(1); -} - -int transfer(num) -int num; -{ - int mid, lin, ntrans; - - if (line1 <= 0 || line1 > line2) return(ERR); - - mid = num < line2 ? num : line2; - - curln = num; - ntrans = 0; - - for (lin = line1; lin <= mid; lin++) { - ins(gettxt(lin)); - ntrans++; - } - lin += ntrans; - line2 += ntrans; - - for (; lin <= line2; lin += 2) { - ins(gettxt(lin)); - line2++; - } - return(1); -} - -/* omatch.c */ -/* #include */ -/* #include "tools.h" */ - -/* Match one pattern element, pointed at by pat, with the character at - * **linp. Return non-zero on match. Otherwise, return 0. *Linp is - * advanced to skip over the matched character; it is not advanced on - * failure. The amount of advance is 0 for patterns that match null - * strings, 1 otherwise. "boln" should point at the position that will - * match a BOL token. - */ -int omatch(linp, pat, boln) -char **linp; -TOKEN *pat; -char *boln; -{ - - register int advance; - - advance = -1; - - if (**linp) { - switch (pat->tok) { - case LITCHAR: - if (**linp == pat->lchar) advance = 1; - break; - - case BOL: - if (*linp == boln) advance = 0; - break; - - case ANY: - if (**linp != '\n') advance = 1; - break; - - case EOL: - if (**linp == '\n') advance = 0; - break; - - case CCL: - if (testbit(**linp, pat->bitmap)) advance = 1; - break; - - case NCCL: - if (!testbit(**linp, pat->bitmap)) advance = 1; - break; - } - } - if (advance >= 0) *linp += advance; - - return(++advance); -} - -/* optpat.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -TOKEN *oldpat; - -TOKEN * - optpat() -{ - char delim, str[MAXPAT], *cp; - - delim = *inptr++; - cp = str; - while (*inptr != delim && *inptr != NL) { - if (*inptr == ESCAPE && inptr[1] != NL) *cp++ = *inptr++; - *cp++ = *inptr++; - } - - *cp = EOS; - if (*str == EOS) return(oldpat); - if (oldpat) unmakepat(oldpat); - oldpat = getpat(str); - return(oldpat); -} - -/* set.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -struct tbl { - char *t_str; - int *t_ptr; - int t_val; -} *t, tbl[] = { - - "number", &nflg, TRUE, - "nonumber", &nflg, FALSE, - "list", &lflg, TRUE, - "nolist", &lflg, FALSE, - "eightbit", &eightbit, TRUE, - "noeightbit", &eightbit, FALSE, - 0 -}; - -int set() -{ - char word[16]; - int i; - - inptr++; - if (*inptr != 't') { - if (*inptr != SP && *inptr != HT && *inptr != NL) return(ERR); - } else - inptr++; - - if (*inptr == NL) return(show()); - /* Skip white space */ - while (*inptr == SP || *inptr == HT) inptr++; - - for (i = 0; *inptr != SP && *inptr != HT && *inptr != NL;) - word[i++] = *inptr++; - word[i] = EOS; - for (t = tbl; t->t_str; t++) { - if (strcmp(word, t->t_str) == 0) { - *t->t_ptr = t->t_val; - return(0); - } - } - return(0); -} - -int show() -{ - extern int version; - - printf("ed version %d.%d\n", version / 100, version % 100); - printf("number %s, list %s\n", nflg ? "ON" : "OFF", lflg ? "ON" : "OFF"); - return(0); -} - -/* setbuf.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -void relink(a, x, y, b) -LINE *a, *x, *y, *b; -{ - x->l_prev = a; - y->l_next = b; -} - -void clrbuf() -{ - del(1, lastln); -} - -void set_buf() -{ - relink(&line0, &line0, &line0, &line0); - curln = lastln = 0; -} - -/* subst.c */ -/* #include */ -/* #include "tools.h" */ -/* #include "ed.h" */ - -int subst(pat, sub, gflg, pflag) -TOKEN *pat; -char *sub; -int gflg, pflag; -{ - int lin, chngd, nchngd; - char *txtptr, *txt; - char *lastm, *m, *new, buf[MAXLINE]; - - if (line1 <= 0) return(ERR); - nchngd = 0; /* reset count of lines changed */ - for (lin = line1; lin <= line2; lin++) { - txt = txtptr = gettxt(lin); - new = buf; - chngd = 0; - lastm = NULL; - while (*txtptr) { - if (gflg || !chngd) - m = amatch(txtptr, pat, txt); - else - m = NULL; - if (m != NULL && lastm != m) { - chngd++; - new = catsub(txtptr, m, sub, new, - buf + MAXLINE); - lastm = m; - } - if (m == NULL || m == txtptr) { - *new++ = *txtptr++; - } else { - txtptr = m; - } - } - if (chngd) { - if (new >= buf + MAXLINE) return(ERR); - *new++ = EOS; - del(lin, lin); - ins(buf); - nchngd++; - if (pflag) doprnt(curln, curln); - } - } - if (nchngd == 0 && !gflg) { - return(ERR); - } - return(nchngd); -} - -/* System.c */ -#define SHELL "/bin/sh" -#define SHELL2 "/usr/bin/sh" - -int System(c) -char *c; -{ - int pid, status; - - switch (pid = fork()) { - case -1: - return -1; - case 0: - execl(SHELL, "sh", "-c", c, (char *) 0); - execl(SHELL2, "sh", "-c", c, (char *) 0); - exit(-1); - default: while (wait(&status) != pid); -} - return status; -} - -/* unmkpat.c */ -/* #include */ -/* #include "tools.h" */ - -/* Free up the memory usde for token string */ -void unmakepat(head) -TOKEN *head; -{ - - register TOKEN *old_head; - - while (head) { - switch (head->tok) { - case CCL: - case NCCL: - free(head->bitmap); - /* Fall through to default */ - - default: - old_head = head; - head = head->next; - free((char *) old_head); - break; - } - } -} diff --git a/util/cpp/LLlex.c b/util/cpp/LLlex.c deleted file mode 100644 index 4bba8c0a2..000000000 --- a/util/cpp/LLlex.c +++ /dev/null @@ -1,375 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* $Id$ */ -/* L E X I C A L A N A L Y Z E R */ - -#include -#include "idfsize.h" -#include "numsize.h" -#include "strsize.h" - -#include -#include "input.h" -#include "idf.h" -#include "LLlex.h" -#include "Lpars.h" -#include "class.h" -#include "bits.h" - -/* Data about the token yielded */ -struct token dot; - -int ReplaceMacros = 1; /* replacing macros */ -int AccFileSpecifier = 0; /* return filespecifier <...> */ -int AccDefined = 0; /* accept "defined(...)" */ -int UnknownIdIsZero = 0; /* interpret unknown id as integer 0 */ - -char *string_token(); - -PushLex() -{ - DOT = 0; -} - -PopLex() -{} - -int -LLlex() -{ - return (DOT != EOF) ? GetToken(&dot) : EOF; -} - -#define BUFSIZ 1024 - -int -GetToken(ptok) - register struct token *ptok; -{ - char buf[BUFSIZ]; - register int c, nch; - -again: /* rescan the input after an error or replacement */ - LoadChar(c); - if ((c & 0200) && c != EOI) - fatal("non-ascii '\\%03o' read", c & 0377); - switch (class(c)) { /* detect character class */ - case STNL: - LineNumber++; - return ptok->tk_symb = EOF; - case STSKIP: - goto again; - case STGARB: /* garbage character */ - if (c == '\\') { - /* a '\\' is allowed in #if/#elif expression */ - LoadChar(c); - if (class(c) == STNL) { /* vt , ff ? */ - ++LineNumber; - goto again; - } - PushBack(); - c = '\\'; - } - if (040 < c && c < 0177) - error("garbage char %c", c); - else - error("garbage char \\%03o", c); - goto again; - case STSIMP: /* a simple character, no part of compound token*/ - if (c == '/') { /* probably the start of comment */ - LoadChar(c); - if (c == '*') { /* start of comment */ - skipcomment(); - goto again; - } - else { - PushBack(); - c = '/'; /* restore c */ - } - } - return ptok->tk_symb = c; - case STCOMP: /* maybe the start of a compound token */ - LoadChar(nch); /* character lookahead */ - switch (c) { - case '!': - if (nch == '=') - return ptok->tk_symb = NOTEQUAL; - PushBack(); - return ptok->tk_symb = c; - case '&': - if (nch == '&') - return ptok->tk_symb = AND; - PushBack(); - return ptok->tk_symb = c; - case '<': - if (AccFileSpecifier) { - PushBack(); /* pushback nch */ - ptok->tk_str = - string_token("file specifier", '>'); - return ptok->tk_symb = FILESPECIFIER; - } - if (nch == '<') - return ptok->tk_symb = LEFT; - if (nch == '=') - return ptok->tk_symb = LESSEQ; - PushBack(); - return ptok->tk_symb = c; - case '=': - if (nch != '=') { - PushBack(); - error("missing ="); - } - return ptok->tk_symb = EQUAL; - case '>': - if (nch == '=') - return ptok->tk_symb = GREATEREQ; - if (nch == '>') - return ptok->tk_symb = RIGHT; - PushBack(); - return ptok->tk_symb = c; - case '|': - if (nch == '|') - return ptok->tk_symb = OR; - PushBack(); - return ptok->tk_symb = c; - } - case STIDF: - { - extern int idfsize; /* ??? */ - register char *tg = &buf[0]; - register char *maxpos = &buf[idfsize]; - register struct idf *idef; - -#define tstmac(bx) if (!(bits[c] & bx)) goto nomac -#define cpy if (Unstacked) EnableMacros(); *tg++ = c -#define load LoadChar(c); if (!in_idf(c)) goto endidf - -#ifdef DOBITS - cpy; tstmac(bit0); load; - cpy; tstmac(bit1); load; - cpy; tstmac(bit2); load; - cpy; tstmac(bit3); load; - cpy; tstmac(bit4); load; - cpy; tstmac(bit5); load; - cpy; tstmac(bit6); load; - cpy; tstmac(bit7); load; -#endif - - for(;;) { - if (tg < maxpos) { - cpy; - } - load; - } - endidf: - PushBack(); - *tg = '\0'; /* mark the end of the identifier */ - if (ReplaceMacros) { - idef = findidf(buf); - if ((idef && idef->id_macro && replace(idef))) { - goto again; - } - } - nomac: - LoadChar(c); - while (in_idf(c)) { - if (tg < maxpos) *tg++ = c; - LoadChar(c); - } - PushBack(); - *tg++ = '\0'; /* mark the end of the identifier */ - if (UnknownIdIsZero) { - ptok->tk_val = 0; - return ptok->tk_symb = INTEGER; - } - ptok->tk_str = Malloc(tg - buf); - strcpy(ptok->tk_str, buf); - return ptok->tk_symb = IDENTIFIER; - } - case STCHAR: /* character constant */ - { - register arith val = 0; - register int size = 0; - - LoadChar(c); - if (c == '\'') - error("character constant too short"); - else - while (c != '\'') { - if (c == '\n') { - error("newline in character constant"); - PushBack(); - break; - } - if (c == '\\') { - LoadChar(c); - if (c == '\n') { - LineNumber++; - } - c = quoted(c); - } - if (c >= 128) c -= 256; - val = val*256 + c; - size++; - LoadChar(c); - } - if (size > sizeof(arith)) - error("character constant too long"); - ptok->tk_val = val; - return ptok->tk_symb = INTEGER; - } - case STNUM: - { - register char *np = &buf[1]; - register int base = 10; - register int vch; - register arith val = 0; - - if (c == '0') { - *np++ = c; - LoadChar(c); - if (c == 'x' || c == 'X') { - base = 16; - LoadChar(c); - } - else - base = 8; - } - while (vch = val_in_base(c, base), vch >= 0) { - val = val*base + vch; - if (np < &buf[NUMSIZE]) - *np++ = c; - LoadChar(c); - } - if (c == 'l' || c == 'L') - LoadChar(c); - PushBack(); - ptok->tk_val = val; - return ptok->tk_symb = INTEGER; - } - case STSTR: - ptok->tk_str = string_token("string", '"'); - return ptok->tk_symb = STRING; - case STEOI: /* end of text on source file */ - return ptok->tk_symb = EOF; - default: - crash("Impossible character class"); - } - /*NOTREACHED*/ -} - -skipcomment() -{ - register int c; - - NoUnstack++; - LoadChar(c); - do { - while (c != '*') { - if (class(c) == STNL) - ++LineNumber; - else - if (c == EOI) { - NoUnstack--; - return; - } - LoadChar(c); - } - /* Last Character seen was '*' */ - LoadChar(c); - } while (c != '/'); - NoUnstack--; -} - -char * -string_token(nm, stop_char) - char *nm; -{ - register int c; - register unsigned int str_size; - register char *str = Malloc(str_size = ISTRSIZE); - register int pos = 0; - - LoadChar(c); - while (c != stop_char) { - if (c == '\n') { - error("newline in %s", nm); - PushBack(); - break; - } - if (c == EOI) { - error("end-of-file inside %s", nm); - break; - } - if (c == '\\') { - LoadChar(c); - if (c == '\n') { - LineNumber++; - LoadChar(c); - continue; - } - c = quoted(c); - } - str[pos++] = c; - if (pos == str_size) - str = Realloc(str, str_size <<= 1); - LoadChar(c); - } - str[pos++] = '\0'; /* for filenames etc. */ - str = Realloc(str, pos); - return str; -} - -int -quoted(c) - register int c; -{ - /* quoted() replaces an escaped character sequence by the - character meant. - */ - /* first char after backslash already in c */ - if (!is_oct(c)) { /* a quoted char */ - switch (c) { - case 'n': - c = '\n'; - break; - case 't': - c = '\t'; - break; - case 'b': - c = '\b'; - break; - case 'r': - c = '\r'; - break; - case 'f': - c = '\f'; - break; - } - } - else { /* a quoted octal */ - register int oct = 0, cnt = 0; - - do { - oct = oct*8 + (c-'0'); - LoadChar(c); - } while (is_oct(c) && ++cnt < 3); - PushBack(); - c = oct; - } - return c&0377; -} - -/* provisional */ -int -val_in_base(c, base) - register int c; -{ - return - is_dig(c) ? c - '0' : - base != 16 ? -1 : - is_hex(c) ? (c - 'a' + 10) & 017 : - -1; -} diff --git a/util/cpp/LLlex.h b/util/cpp/LLlex.h deleted file mode 100644 index bd511515a..000000000 --- a/util/cpp/LLlex.h +++ /dev/null @@ -1,44 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* D E F I N I T I O N S F O R T H E L E X I C A L A N A L Y Z E R */ - -/* A token from the input stream is represented by an integer, - called a "symbol", but it may have other information associated - to it. -*/ - -#include - -/* the structure of a token: */ -struct token { - int tok_symb; /* the token itself */ - union { - arith tok_val; /* numeric values */ - char *tok_str; /* string/filespecifier */ - } tok_data; -}; - -#include "file_info.h" - -#define tk_symb tok_symb -#define tk_val tok_data.tok_val -#define tk_str tok_data.tok_str - -extern struct token dot; - -extern int ReplaceMacros; /* "LLlex.c" */ -extern int AccFileSpecifier; /* "LLlex.c" */ -extern int AccDefined; /* "LLlex.c" */ -extern int UnknownIdIsZero; /* "LLlex.c" */ - -extern int NoUnstack; /* "input.c" */ -extern int Unstacked; /* "input.c" */ - -extern int err_occurred; /* "error.c" */ - -#define DOT dot.tk_symb - -#define EOF (-1) diff --git a/util/cpp/LLmessage.c b/util/cpp/LLmessage.c deleted file mode 100644 index 218d78744..000000000 --- a/util/cpp/LLmessage.c +++ /dev/null @@ -1,23 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* PARSER ERROR ADMINISTRATION */ - -#include "LLlex.h" -#include "Lpars.h" - -extern char *symbol2str(); - -LLmessage(tk) { - if (tk < 0) - error("garbage at end of line"); - else if (tk) { - error("%s missing", symbol2str(tk)); - skipline(); - DOT = EOF; - } - else - error("%s deleted", symbol2str(DOT)); -} diff --git a/util/cpp/Parameters b/util/cpp/Parameters deleted file mode 100644 index 9b2fe6b47..000000000 --- a/util/cpp/Parameters +++ /dev/null @@ -1,72 +0,0 @@ -!File: pathlength.h -#define PATHLENGTH 1024 /* max. length of path to file */ - - -!File: errout.h -#define ERROUT STDERR /* file pointer for writing messages */ -#define MAXERR_LINE 5 /* maximum number of error messages given - on the same input line. */ - - -!File: idfsize.h -#define IDFSIZE 64 /* maximum significant length of an identifier */ - - -!File: numsize.h -#define NUMSIZE 256 /* maximum length of a numeric constant */ - - -!File: nparams.h -#define NPARAMS 32 /* maximum number of parameters of macros */ - - -!File: ifdepth.h -#define IFDEPTH 256 /* maximum number of nested if-constructions */ - - -!File: lapbuf.h -#define LAPBUF 4096 /* size of macro actual parameter buffer */ - - -!File: strsize.h -#define ISTRSIZE 16 /* minimum number of bytes allocated for - storing a string */ - - -!File: botch_free.h -/*#define BOTCH_FREE 1 /* botch freed memory, as a check */ - - -!File: debug.h -/*#define DEBUG 1 /* perform various self-tests */ -#define NDEBUG 1 /* disable assertions */ - - -!File: parbufsize.h -#define PARBUFSIZE 1024 - - -!File: textsize.h -#define ITEXTSIZE 16 /* 1st piece of memory for repl. text */ - - -!File: inputtype.h -/*#define INP_READ_IN_ONE 1 /* read input file in one. */ - /* If defined, we cannot read from a pipe */ - - -!File: obufsize.h -#define OBUFSIZE 8192 /* output buffer size */ - - -!File: dobits.h -#define DOBITS 1 /* use trick to reduce symboltable accesses */ - - -!File: line_prefix.h -#define LINE_PREFIX "#" /* prefix for generated line directives, - either "#" or "#line" - */ - - - diff --git a/util/cpp/bits.h b/util/cpp/bits.h deleted file mode 100644 index b61ecf55c..000000000 --- a/util/cpp/bits.h +++ /dev/null @@ -1,18 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "dobits.h" -#ifdef DOBITS -#define bit0 0x01 -#define bit1 0x02 -#define bit2 0x04 -#define bit3 0x08 -#define bit4 0x10 -#define bit5 0x20 -#define bit6 0x40 -#define bit7 0x80 - -extern char bits[]; -#endif diff --git a/util/cpp/ch7bin.c b/util/cpp/ch7bin.c deleted file mode 100644 index ca2b3b987..000000000 --- a/util/cpp/ch7bin.c +++ /dev/null @@ -1,80 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* EVALUATION OF BINARY OPERATORS */ - -#include "Lpars.h" -#include - -ch7bin(pval, oper, val) - register arith *pval, val; - int oper; -{ - switch (oper) { - case '%': - if (val == 0) - error("%% by 0"); - else - *pval = *pval % val; - break; - case '/': - if (val == 0) - error("/ by 0"); - else - *pval = *pval / val; - break; - case '*': - *pval = *pval * val; - break; - case '+': - *pval = *pval + val; - break; - case '-': - *pval = *pval - val; - break; - case LEFT: - *pval = *pval << val; - break; - case RIGHT: - *pval = *pval >> val; - break; - case '<': - *pval = (*pval < val); - break; - case '>': - *pval = (*pval > val); - break; - case LESSEQ: - *pval = (*pval <= val); - break; - case GREATEREQ: - *pval = (*pval >= val); - break; - case EQUAL: - *pval = (*pval == val); - break; - case NOTEQUAL: - *pval = (*pval != val); - break; - case '&': - *pval = *pval & val; - break; - case '^': - *pval = *pval ^ val; - break; - case '|': - *pval = *pval | val; - break; - case AND: - *pval = (*pval && val); - break; - case OR: - *pval = (*pval || val); - break; - case ',': - *pval = val; - break; - } -} diff --git a/util/cpp/ch7mon.c b/util/cpp/ch7mon.c deleted file mode 100644 index 8e88ed8c4..000000000 --- a/util/cpp/ch7mon.c +++ /dev/null @@ -1,25 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* EVALUATION OF MONADIC OPERATORS */ - -#include "Lpars.h" -#include - -ch7mon(oper, pval) - register arith *pval; -{ - switch (oper) { - case '~': - *pval = ~(*pval); - break; - case '-': - *pval = -(*pval); - break; - case '!': - *pval = !(*pval); - break; - } -} diff --git a/util/cpp/char.tab b/util/cpp/char.tab deleted file mode 100644 index b76e3fecc..000000000 --- a/util/cpp/char.tab +++ /dev/null @@ -1,36 +0,0 @@ -% -% CHARACTER CLASSES -% -% some general settings: -%F %s, -%S257 -% -% START OF TOKEN -% -%iSTGARB -STSKIP:\r \t\f\013 -STNL:\n -STCOMP:!&<=>| -STSIMP:-%()+*,/:?^~ -STCHAR:' -STIDF:a-zA-Z_ -STNUM:0-9 -STSTR:" -STEOI:\200 -%T/* character classes */ -%T#include "class.h" -%Tchar tkclass[] = { -%p -%T}; -% -% other kinds of classes -% -%C -_D_|_H_|_I_|_O_:0-7 -_D_|_H_|_I_:89 -_H_|_I_:a-fA-F -_I_:g-zG-Z_ -%Tchar tk2class[] = { -%F %s, -%p -%T}; diff --git a/util/cpp/class.h b/util/cpp/class.h deleted file mode 100644 index 7d97d1542..000000000 --- a/util/cpp/class.h +++ /dev/null @@ -1,44 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* U S E O F C H A R A C T E R C L A S S E S */ - -/* As a starter, chars are divided into classes, according to which - token they can be the start of. - At present such a class number is supposed to fit in 4 bits. -*/ - -#define class(ch) (tkclass[(unsigned char) ch]) - -/* Being the start of a token is, fortunately, a mutual exclusive - property, so, as there are less than 16 classes they can be - packed in 4 bits. -*/ - -#define STSKIP 0 /* spaces and so on: skipped characters */ -#define STNL 1 /* newline character(s): update linenumber etc. */ -#define STGARB 2 /* garbage ascii character: not allowed */ -#define STSIMP 3 /* this character can occur as token */ -#define STCOMP 4 /* this one can start a compound token */ -#define STIDF 5 /* being the initial character of an identifier */ -#define STCHAR 6 /* the starter of a character constant */ -#define STSTR 7 /* the starter of a string */ -#define STNUM 8 /* the starter of a numeric constant */ -#define STEOI 9 /* End-Of-Information mark */ - -/* But occurring inside a token is not, so we need 1 bit for each - class. -*/ -#define _I_ 01 -#define _O_ 02 -#define _D_ 04 -#define _H_ 010 - -#define in_idf(ch) (tk2class[(unsigned char)ch] & _I_) -#define is_oct(ch) (tk2class[(unsigned char)ch] & _O_) -#define is_dig(ch) (tk2class[(unsigned char)ch] & _D_) -#define is_hex(ch) (tk2class[(unsigned char)ch] & _H_) - -extern char tkclass[], tk2class[]; diff --git a/util/cpp/cpp.6 b/util/cpp/cpp.6 deleted file mode 100644 index aad642ad6..000000000 --- a/util/cpp/cpp.6 +++ /dev/null @@ -1,76 +0,0 @@ -.TH CPP 6 "$Revision$" -.ad -.SH NAME -cpp \- C Pre-Processor -.SH SYNOPSIS -.B ~em/lib.bin/cpp -[\-options] [ file ] -.SH DESCRIPTION -.I Cpp -reads a file, expands macros and include -files, and writes an input file for the C compiler. -All output is to standard output. -.br -The following options are supported. -.IP -\fBI\fIdirectory\fR -.br -add this directory to the list of -directories searched for #include "..." and #include <...> -commands. Note that there is no space between the -"-I" and the directory string. More than one -I command -is permitted. -.IP -\fBI\fR -end the list of directories to be searched, and also do not look in -default places. -.IP -\fBD\fIname\fR=\fItext\fR -.br -define -.I name -as a macro with -.I text -as its replacement text. -.IP -\fBD\fIname\fR -the same as -\fBD\fIname\fR=1. -.IP -\fBU\fIname\fR -.br -undefine the macro name -.IR name . -.IP -\fBC\fR -leave comments in. By default, C-comments are deleted. -.IP -\fBP\fR -do not generate line directives -.IP -\fBM\fIn\fR -set maximum identifier length to -.IR n . -.IP -\fBd\fR[\fIfile\fR] -.br -if \fIfile\fR is not given, do not preprocess, but instead generate a list -of makefile dependencies and write them to the standard output. -If \fIfile\fP is given, generate preprocessor output on standard output, -and generate the list of makefile dependencies on file \fIfile\fP. -.IP -\fBA\fR[\fIfile\fR] -identical to the -d option. -.IP -\fBi\fR -when generating makefile dependencies, do not include files from -/usr/include. -.IP -\fBm\fR -when generating makefile dependencies, generate them in the following format: -.RS -.IP "file.o: file1.h" -.RE -.IP "" -where "file.o" is derived from the source file name. Normally, only a list -of files included is generated. -.IP -\fBundef\fR -.br -this flag is silently ignored, for compatibility with other preprocessors. -.PP -The following names are always available unless undefined: -.IP __FILE__ -The input (or #include) file being compiled -(as a quoted string). -.IP __LINE__ -The line number being compiled. -.IP __DATE__ -The date and time of compilation as -a Unix ctime quoted string (the trailing newline is removed). diff --git a/util/cpp/domacro.c b/util/cpp/domacro.c deleted file mode 100644 index 5fd71eba5..000000000 --- a/util/cpp/domacro.c +++ /dev/null @@ -1,718 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* $Id$ */ -/* PREPROCESSOR: CONTROLLINE INTERPRETER */ - -#include "interface.h" -#include "LLlex.h" -#include "Lpars.h" -#include "debug.h" -#include "idf.h" -#include "input.h" - -#include "ifdepth.h" -#include "botch_free.h" -#include "nparams.h" -#include "parbufsize.h" -#include "textsize.h" -#include "idfsize.h" -#include -#include -#include "class.h" -#include "macro.h" -#include "bits.h" - -IMPORT char **inctable; /* list of include directories */ -IMPORT char *getwdir(); -PRIVATE char ifstack[IFDEPTH]; /* if-stack: the content of an entry is */ - /* 1 if a corresponding ELSE has been */ - /* encountered. */ - -int nestlevel = -1; -int svnestlevel[30] = {-1}; -int nestcount; -extern int do_preprocess; - -char * -GetIdentifier() -{ - /* returns a pointer to the descriptor of the identifier that is - read from the input stream. A null-pointer is returned if - the input does not contain an identifier. - The substitution of macros is disabled. - */ - int tok; - struct token tk; - - ReplaceMacros = 0; - tok = GetToken(&tk); - ReplaceMacros = 1; - return tok == IDENTIFIER ? tk.tk_str : (char *)0; -} - -/* domacro() is the control line interpreter. The '#' has already - been read by the lexical analyzer by which domacro() is called. - The token appearing directly after the '#' is obtained by calling - the basic lexical analyzing function GetToken() and is interpreted - to perform the action belonging to that token. - An error message is produced when the token is not recognized, - i.e. it is not one of "define" .. "undef" , integer or newline. -*/ -EXPORT -domacro() -{ - struct token tk; /* the token itself */ - register struct idf *id; - - switch(GetToken(&tk)) { /* select control line action */ - case IDENTIFIER: /* is it a macro keyword? */ - id = findidf(tk.tk_str); - if (!id) { - error("%s: unknown control", tk.tk_str); - skipline(); - free(tk.tk_str); - break; - } - free(tk.tk_str); - switch (id->id_resmac) { - case K_DEFINE: /* "define" */ - do_define(); - break; - case K_ELIF: /* "elif" */ - do_elif(); - break; - case K_ELSE: /* "else" */ - do_else(); - break; - case K_ENDIF: /* "endif" */ - do_endif(); - break; - case K_IF: /* "if" */ - do_if(); - break; - case K_IFDEF: /* "ifdef" */ - do_ifdef(1); - break; - case K_IFNDEF: /* "ifndef" */ - do_ifdef(0); - break; - case K_INCLUDE: /* "include" */ - do_include(); - break; - case K_LINE: /* "line" */ - /* set LineNumber and FileName according to - the arguments. - */ - if (GetToken(&tk) != INTEGER) { - error("#line without linenumber"); - PushBack(); - skipline(); - } - else - do_line((unsigned int)tk.tk_val); - break; - case K_UNDEF: /* "undef" */ - do_undef(); - break; - case K_PRAGMA: /* "pragma" */ - /* ignore for now - */ - skipline(); - break; - default: - /* invalid word seen after the '#' */ - error("%s: unknown control", id->id_text); - skipline(); - } - break; - case INTEGER: /* # []? */ - do_line((unsigned int)tk.tk_val); - break; - case EOF: /* only `#' on this line: do nothing, ignore */ - break; - default: /* invalid token following '#' */ - error("illegal # line"); - PushBack(); - skipline(); - } -} - -PRIVATE -skip_block(to_endif) -{ - /* skip_block() skips the input from - 1) a false #if, #ifdef, #ifndef or #elif until the - corresponding #elif (resulting in true), #else or - #endif is read. - 2) a #else corresponding to a true #if, #ifdef, - #ifndef or #elif until the corresponding #endif is - seen. - */ - register int ch; - register int skiplevel = nestlevel; /* current nesting level */ - struct token tk; - struct idf *id; - - NoUnstack++; - for (;;) { - LoadChar(ch); /* read first character after newline */ - if (ch != '#') { - if (ch == EOI) { - NoUnstack--; - return; - } - PushBack(); - skipline(); - continue; - } - if (GetToken(&tk) != IDENTIFIER) { - PushBack(); - skipline(); - continue; - } - /* an IDENTIFIER: look for #if, #ifdef and #ifndef - without interpreting them. - Interpret #else, #elif and #endif if they occur - on the same level. - */ - id = findidf(tk.tk_str); - free(tk.tk_str); - if (id) switch(id->id_resmac) { - default: - skipline(); - break; - case K_IF: - case K_IFDEF: - case K_IFNDEF: - push_if(); - skipline(); - continue; - case K_ELIF: - if (ifstack[nestlevel]) - warning("#elif after #else/#elif"); - if (! to_endif && nestlevel == skiplevel) { - nestlevel--; - push_if(); - if (ifexpr()) { /* implicit skipline() */ - NoUnstack--; - return; - } - } - else skipline(); - break; - case K_ELSE: - if (ifstack[nestlevel]) - warning("#else after #else/#elif"); - skipline(); - if (! to_endif) { - ++(ifstack[nestlevel]); - if (nestlevel == skiplevel) { - NoUnstack--; - return; - } - } - break; - case K_ENDIF: - assert(nestlevel >= 0); - skipline(); - if (nestlevel == skiplevel) { - nestlevel--; - NoUnstack--; - return; - } - nestlevel--; - break; - } - } -} - -PRIVATE -ifexpr() -{ - /* ifexpr() returns whether the restricted constant - expression following #if or #elif evaluates to true. This - is done by calling the LLgen generated subparser for - constant expressions. The result of this expression will - be given in the extern long variable "ifval". - */ - IMPORT arith ifval; - int errors = err_occurred; - - ifval = (arith)0; - AccDefined = 1; - UnknownIdIsZero = 1; - PushLex(); /* NEW parser */ - If_expr(); /* invoke constant expression parser */ - PopLex(); /* OLD parser */ - AccDefined = 0; - UnknownIdIsZero = 0; - return (errors == err_occurred) && (ifval != (arith)0); -} - -PRIVATE -do_include() -{ - /* do_include() performs the inclusion of a file. - */ - char *filenm; - char *result; - int tok; - struct token tk; - - AccFileSpecifier = 1; - if (((tok = GetToken(&tk)) == FILESPECIFIER) || tok == STRING) - filenm = tk.tk_str; - else { - error("bad include syntax"); - filenm = (char *)0; - } - AccFileSpecifier = 0; - PushBack(); - skipline(); - inctable[0] = WorkingDir; - if (filenm) { - if (!InsertFile(filenm, &inctable[tok==FILESPECIFIER],&result)){ - if (do_preprocess) error("cannot find include file \"%s\"", filenm); - else warning("cannot find include file \"%s\"", filenm); - add_dependency(filenm); - } - else { - add_dependency(result); - WorkingDir = getwdir(result); - svnestlevel[++nestcount] = nestlevel; - FileName = result; - LineNumber = 1; - } - } -} - -PRIVATE -do_define() -{ - /* do_define() interprets a #define control line. - */ - char *str; - int nformals = -1; /* keep track of the number of formals */ - char *formals[NPARAMS]; /* pointers to the names of the formals */ - char parbuf[PARBUFSIZE]; /* names of formals */ - char *repl_text; /* start of the replacement text */ - int length; /* length of the replacement text */ - register ch; - char *get_text(); - - /* read the #defined macro's name */ - if (!(str = GetIdentifier())) { - error("#define: illegal macro name"); - PushBack(); - skipline(); - return; - } - /* there is a formal parameter list if the identifier is - followed immediately by a '('. - */ - LoadChar(ch); - if (ch == '(') { - if ((nformals = getparams(formals, parbuf)) == -1) { - PushBack(); - skipline(); - free(str); - return; /* an error occurred */ - } - LoadChar(ch); - } - /* read the replacement text if there is any */ - ch = skipspaces(ch,0); /* find first character of the text */ - assert(ch != EOI); - if (class(ch) == STNL) { - /* Treat `#define something' as `#define something ""' - */ - repl_text = ""; - length = 0; - } - else { - PushBack(); - repl_text = get_text((nformals > 0) ? formals : 0, &length); - } - macro_def(str2idf(str, 0), repl_text, nformals, length, NOFLAG); - LineNumber++; -} - -PRIVATE -push_if() -{ - if (nestlevel >= IFDEPTH) - fatal("too many nested #if/#ifdef/#ifndef"); - else - ifstack[++nestlevel] = 0; -} - -PRIVATE -do_elif() -{ - if (nestlevel <= svnestlevel[nestcount] || (ifstack[nestlevel])) { - error("#elif without corresponding #if"); - skipline(); - } - else { /* restart at this level as if a #if is detected. */ - nestlevel--; - push_if(); - skip_block(1); - } -} - -PRIVATE -do_else() -{ - skipline(); - if (nestlevel <= svnestlevel[nestcount] || (ifstack[nestlevel])) - error("#else without corresponding #if"); - else { /* mark this level as else-d */ - ++(ifstack[nestlevel]); - skip_block(1); - } -} - -PRIVATE -do_endif() -{ - skipline(); - if (nestlevel <= svnestlevel[nestcount]) - error("#endif without corresponding #if"); - else nestlevel--; -} - -PRIVATE -do_if() -{ - push_if(); - if (!ifexpr()) /* a false #if/#elif expression */ - skip_block(0); -} - -PRIVATE -do_ifdef(how) -{ - register struct idf *id; - char *str; - - /* how == 1 : ifdef; how == 0 : ifndef - */ - push_if(); - str = GetIdentifier(); - if (!str) { - error("illegal #ifdef construction"); - id = 0; - } - else { - id = findidf(str); - free(str); - } - - /* The next test is a shorthand for: - (how && !id->id_macro) || (!how && id->id_macro) - */ - if (how ^ (id && id->id_macro != 0)) - skip_block(0); - else { - PushBack(); - skipline(); - } -} - -PRIVATE -do_undef() -{ - register struct idf *id; - register char *str = GetIdentifier(); - - /* Forget a macro definition. */ - if (str) { - if (id = findidf(str)) { - if (id->id_macro) { /* forget the macro */ - free_macro(id->id_macro); - id->id_macro = (struct macro *) 0; - } /* else: don't complain */ - } - free(str); - } - else - error("illegal #undef construction"); - PushBack(); - skipline(); -} - -PRIVATE -do_line(l) - unsigned int l; -{ - struct token tk; - int t = GetToken(&tk); - - PushBack(); - skipline(); - LineNumber = l; /* the number of the next input line */ - if (t == STRING) /* is there a filespecifier? */ - FileName = tk.tk_str; -} - -PRIVATE int -getparams(buf, parbuf) - char *buf[]; - char parbuf[]; -{ - /* getparams() reads the formal parameter list of a macro - definition. - The number of parameters is returned. - As a formal parameter list is expected when calling this - routine, -1 is returned if an error is detected, for - example: - #define one(1), where 1 is not an identifier. - Note that the '(' has already been eaten. - The names of the formal parameters are stored into parbuf. - */ - register char **pbuf = &buf[0]; - register int c; - register char *ptr = &parbuf[0]; - register char **pbuf2; - - LoadChar(c); - c = skipspaces(c,0); - if (c == ')') { /* no parameters: #define name() */ - *pbuf = (char *) 0; - return 0; - } - for (;;) { /* eat the formal parameter list */ - if (class(c) != STIDF) { /* not an identifier */ - error("#define: bad formal parameter"); - return -1; - } - *pbuf = ptr; /* name of the formal */ - *ptr++ = c; - if (ptr >= &parbuf[PARBUFSIZE]) - fatal("formal parameter buffer overflow"); - do { /* eat the identifier name */ - LoadChar(c); - *ptr++ = c; - if (ptr >= &parbuf[PARBUFSIZE]) - fatal("formal parameter buffer overflow"); - } while (in_idf(c)); - *(ptr - 1) = '\0'; /* mark end of the name */ - - /* Check if this formal parameter is already used. - Usually, macros do not have many parameters, so ... - */ - for (pbuf2 = pbuf - 1; pbuf2 >= &buf[0]; pbuf2--) { - if (!strcmp(*pbuf2, *pbuf)) { - warning("formal parameter \"%s\" already used", - *pbuf); - } - } - - pbuf++; - c = skipspaces(c,0); - if (c == ')') { /* end of the formal parameter list */ - *pbuf = (char *) 0; - return pbuf - buf; - } - if (c != ',') { - error("#define: bad formal parameter list"); - return -1; - } - LoadChar(c); - c = skipspaces(c,0); - } - /*NOTREACHED*/ -} - -EXPORT -macro_def(id, text, nformals, length, flags) - register struct idf *id; - char *text; -{ - /* macro_def() puts the contents and information of a macro - definition into a structure and stores it into the symbol - table entry belonging to the name of the macro. - A warning is given if the definition overwrites another. - */ - register struct macro *newdef = id->id_macro; - - if (newdef) { /* is there a redefinition? */ - if (macroeq(newdef->mc_text, text)) - return; - warning("redefine \"%s\"", id->id_text); - } - else { -#ifdef DOBITS - register char *p = id->id_text; -#define setbit(bx) if (!*p) goto go_on; bits[*p++] |= (bx) - setbit(bit0); - setbit(bit1); - setbit(bit2); - setbit(bit3); - setbit(bit4); - setbit(bit5); - setbit(bit6); - setbit(bit7); - - go_on: -#endif - id->id_macro = newdef = new_macro(); - } - newdef->mc_text = text; /* replacement text */ - newdef->mc_nps = nformals; /* nr of formals */ - newdef->mc_length = length; /* length of repl. text */ - newdef->mc_flag = flags; /* special flags */ - newdef->mc_count = 0; -} - -PRIVATE int -find_name(nm, index) - char *nm, *index[]; -{ - /* find_name() returns the index of "nm" in the namelist - "index" if it can be found there. 0 is returned if it is - not there. - */ - register char **ip = &index[0]; - - while (*ip) - if (strcmp(nm, *ip++) == 0) - return ip - &index[0]; - /* arrived here, nm is not in the name list. */ - return 0; -} - -PRIVATE char * -get_text(formals, length) - char *formals[]; - int *length; -{ - /* get_text() copies the replacement text of a macro - definition with zero, one or more parameters, thereby - substituting each formal parameter by a special character - (non-ascii: 0200 & (order-number in the formal parameter - list)) in order to substitute this character later by the - actual parameter. The replacement text is copied into - itself because the copied text will contain fewer or the - same amount of characters. The length of the replacement - text is returned. - - Implementation: - finite automaton : we are only interested in - identifiers, because they might be replaced by some actual - parameter. Other tokens will not be seen as such. - */ - register int c; - register unsigned int text_size; - char *text = Malloc(text_size = ITEXTSIZE); - register unsigned int pos = 0; - - LoadChar(c); - - while ((c != EOI) && (class(c) != STNL)) { - if (c == '\\') { /* check for "\\\n" */ - LoadChar(c); - if (c == '\n') { - /* More than one line is used for the - replacement text. - Replace "\\\n" by " ". - */ - text[pos++] = ' '; - ++LineNumber; - LoadChar(c); - } - else - text[pos++] = '\\'; - if (pos == text_size) - text = Realloc(text, text_size <<= 1); - } - else - if ( c == '/') { - LoadChar(c); - if (c == '*') { - skipcomment(); - /* text[pos++] = ' '; ??? Why ??? */ - LoadChar(c); - } - else - text[pos++] = '/'; - if (pos == text_size) - text = Realloc(text, text_size <<= 1); - } - else - if (formals && class(c) == STIDF) { - char id_buf[IDFSIZE + 1]; - register char *idp = id_buf; - int n; - - /* read identifier: it may be a formal parameter */ - *idp++ = c; - do { - LoadChar(c); - if (idp <= &id_buf[IDFSIZE]) - *idp++ = c; - } while (in_idf(c)); - *--idp = '\0'; - if (n = find_name(id_buf, formals)) { - /* construct the formal parameter mark */ - text[pos++] = FORMALP | (char) n; - if (pos == text_size) - text = Realloc(text, - text_size <<= 1); - } - else { - int sz = idp - id_buf + 1; - - idp = id_buf; - - while (pos + sz >= text_size) text_size <<= 1; - text = Realloc(text, text_size); - while (text[pos++] = *idp++) ; - pos--; - } - } - else { - text[pos++] = c; - if (pos == text_size) - text = Realloc(text, text_size <<= 1); - LoadChar(c); - } - } - text[pos++] = '\0'; - text = Realloc(text, pos); - *length = pos - 1; - return text; -} - -#define BLANK(ch) ((ch == ' ') || (ch == '\t')) - -/* macroeq() decides whether two macro replacement texts are - identical. This version compares the texts, which occur - as strings, without taking care of the leading and trailing - blanks (spaces and tabs). -*/ -PRIVATE -macroeq(s, t) - register char *s, *t; -{ - - /* skip leading spaces */ - while (BLANK(*s)) s++; - while (BLANK(*t)) t++; - /* first non-blank encountered in both strings */ - /* The actual comparison loop: */ - while (*s && *s == *t) - s++, t++; - /* two cases are possible when arrived here: */ - if (*s == '\0') { /* *s == '\0' */ - while (BLANK(*t)) t++; - return *t == '\0'; - } - else { /* *s != *t */ - while (BLANK(*s)) s++; - while (BLANK(*t)) t++; - return (*s == '\0') && (*t == '\0'); - } -} diff --git a/util/cpp/error.c b/util/cpp/error.c deleted file mode 100644 index 11ffbf276..000000000 --- a/util/cpp/error.c +++ /dev/null @@ -1,148 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* E R R O R A N D D I A G N O S T I C R O U T I N E S */ - -#include -#if __STDC__ -#include -#else -#include -#endif - -#include "errout.h" -#include "LLlex.h" - -/* This file contains the (non-portable) error-message and diagnostic - functions. Beware, they are called with a variable number of - arguments! -*/ - -int err_occurred; - -err_hdr(s) - char *s; -{ - if (FileName) { - fprint(ERROUT, "\"%s\", line %d: %s", FileName, LineNumber, s); - } - else fprint(ERROUT, s); -} - -#if __STDC__ -/*VARARGS1*/ -error(char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - err_hdr(""); - err_occurred = 1; - doprnt(ERROUT, fmt, ap); - fprint(ERROUT, "\n"); - va_end(ap); -} - -/*VARARGS1*/ -warning(char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - err_hdr("(warning) "); - doprnt(ERROUT, fmt, ap); - fprint(ERROUT, "\n"); - va_end(ap); -} - -/*VARARGS1*/ -crash(char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - err_hdr("CRASH\007 "); - doprnt(ERROUT, fmt, ap); - fprint(ERROUT, "\n"); - va_end(ap); - sys_stop(S_ABORT); -} - -/*VARARGS1*/ -fatal(char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - err_hdr("fatal error -- "); - doprnt(ERROUT, fmt, ap); - fprint(ERROUT, "\n"); - va_end(ap); - sys_stop(S_EXIT); -} -#else /* __STDC__ */ -/*VARARGS1*/ -error(va_alist) - va_dcl -{ - char *fmt; - va_list ap; - - err_hdr(""); - err_occurred = 1; - va_start(ap); - fmt = va_arg(ap, char *); - doprnt(ERROUT, fmt, ap); - fprint(ERROUT, "\n"); - va_end(ap); -} - -/*VARARGS1*/ -warning(va_alist) - va_dcl -{ - char *fmt; - va_list ap; - - err_hdr("(warning) "); - va_start(ap); - fmt = va_arg(ap, char *); - doprnt(ERROUT, fmt, ap); - fprint(ERROUT, "\n"); - va_end(ap); -} - -/*VARARGS1*/ -crash(va_alist) - va_dcl -{ - char *fmt; - va_list ap; - - err_hdr("CRASH\007 "); - va_start(ap); - fmt = va_arg(ap, char *); - doprnt(ERROUT, fmt, ap); - fprint(ERROUT, "\n"); - va_end(ap); - sys_stop(S_ABORT); -} - -/*VARARGS1*/ -fatal(va_alist) - va_dcl -{ - char *fmt; - va_list ap; - - err_hdr("fatal error -- "); - va_start(ap); - fmt = va_arg(ap, char *); - doprnt(ERROUT, fmt, ap); - fprint(ERROUT, "\n"); - va_end(ap); - sys_stop(S_EXIT); -} -#endif diff --git a/util/cpp/expr.c b/util/cpp/expr.c deleted file mode 100644 index f2c7fde2a..000000000 --- a/util/cpp/expr.c +++ /dev/null @@ -1,58 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* OPERATOR HANDLING */ - -#include "Lpars.h" - -int -rank_of(oper) - int oper; -{ - /* The rank of the operator oper is returned. - */ - switch (oper) { - default: - return 0; - case '(': - return 1; - case '!': - return 2; - case '*': - case '/': - case '%': - return 3; - case '+': - case '-': - return 4; - case LEFT: - case RIGHT: - return 5; - case '<': - case '>': - case LESSEQ: - case GREATEREQ: - return 6; - case EQUAL: - case NOTEQUAL: - return 7; - case '&': - return 8; - case '^': - return 9; - case '|': - return 10; - case AND: - return 11; - case OR: - return 12; - case '?': - case ':': - return 13; - case ',': - return 15; - } - /*NOTREACHED*/ -} diff --git a/util/cpp/expression.g b/util/cpp/expression.g deleted file mode 100644 index 16e86d242..000000000 --- a/util/cpp/expression.g +++ /dev/null @@ -1,130 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* EXPRESSION SYNTAX PARSER */ - -%lexical LLlex; -%start If_expr, if_expression; - -{ -#include "LLlex.h" -#include - -extern arith ifval; -} - -if_expression -: - constant_expression(&ifval) -; - -/* 7.1 */ -primary(arith *pval;) -: - constant(pval) -| - '(' expression(pval) ')' -; - -unary(arith *pval;) - {int oper;} -: - unop(&oper) - unary(pval) - { ch7mon(oper, pval); } -| - primary(pval) -; - -binary_expression(int maxrank; arith *pval;) - {int oper; arith val1;} -: - unary(pval) - [%while (rank_of(DOT) <= maxrank) - binop(&oper) - binary_expression(rank_of(oper)-1, &val1) - { - ch7bin(pval, oper, val1); - } - ]* -; - -/* 7.13 */ -conditional_expression(arith *pval;) - {arith val1 = 0, val2 = 0;} -: - /* allow all binary operators */ - binary_expression(rank_of('?') - 1, pval) - [ '?' - expression(&val1) - ':' - assignment_expression(&val2) - { *pval = (*pval ? val1 : val2); } - ]? -; - -/* 7.14 */ -assignment_expression(arith *pval;) -: - conditional_expression(pval) -; - -/* 7.15 */ -expression(arith *pval;) - {arith val1;} -: - assignment_expression(pval) - [ ',' - assignment_expression(&val1) - { - ch7bin(pval, ',', val1); - } - ]* -; - -unop(int *oper;) : - [ '-' | '!' | '~' ] - {*oper = DOT;} -; - -multop: - '*' | '/' | '%' -; - -addop: - '+' | '-' -; - -shiftop: - LEFT | RIGHT -; - -relop: - '<' | '>' | LESSEQ | GREATEREQ -; - -eqop: - EQUAL | NOTEQUAL -; - -arithop: - multop | addop | shiftop -| - '&' | '^' | '|' -; - -binop(int *oper;) : - [ arithop | relop | eqop | AND | OR ] - {*oper = DOT;} -; - -constant(arith *pval;) : - INTEGER - {*pval = dot.tk_val;} -; - -constant_expression (arith *pval;) : - assignment_expression(pval) -; diff --git a/util/cpp/file_info.h b/util/cpp/file_info.h deleted file mode 100644 index 8d94b01e5..000000000 --- a/util/cpp/file_info.h +++ /dev/null @@ -1,18 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* F I L E I N F O R M A T I O N S T R U C T U R E */ - -struct file_info { - unsigned int fil_lino; - char *fil_name; - char *fil_wdir; -}; - -#define LineNumber finfo.fil_lino -#define FileName finfo.fil_name -#define WorkingDir finfo.fil_wdir - -extern struct file_info finfo; /* input.c */ diff --git a/util/cpp/idf.c b/util/cpp/idf.c deleted file mode 100644 index 0e96184ac..000000000 --- a/util/cpp/idf.c +++ /dev/null @@ -1,7 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "idf.h" -#include diff --git a/util/cpp/idf.h b/util/cpp/idf.h deleted file mode 100644 index 057c42e43..000000000 --- a/util/cpp/idf.h +++ /dev/null @@ -1,20 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -struct id_usr { - union { - struct macro *idu_macro; - struct idf *idu_file; - } idu_x; - int idu_resmac; -}; - -#define IDF_TYPE struct id_usr -#define IDF_HSIZE 6 -#define id_macro id_user.idu_x.idu_macro -#define id_file id_user.idu_x.idu_file -#define id_resmac id_user.idu_resmac - -#include diff --git a/util/cpp/init.c b/util/cpp/init.c deleted file mode 100644 index 8a7273711..000000000 --- a/util/cpp/init.c +++ /dev/null @@ -1,77 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* PREPROCESSOR: INITIALIZATION ROUTINES */ - -#include -#include -#include -#include "class.h" -#include "macro.h" -#include "idf.h" -#include "interface.h" - -PRIVATE struct mkey { - char *mk_reserved; - int mk_key; -} mkey[] = { - {"define", K_DEFINE}, - {"elif", K_ELIF}, - {"else", K_ELSE}, - {"endif", K_ENDIF}, - {"if", K_IF}, - {"ifdef", K_IFDEF}, - {"ifndef", K_IFNDEF}, - {"include", K_INCLUDE}, - {"line", K_LINE}, - {"undef", K_UNDEF}, - {"pragma", K_PRAGMA}, - {0, K_UNKNOWN} -}; - -EXPORT -init_pp() -{ - long clock, sys_time(); - static char date[30]; - char *ctime(); - - /* Initialise the control line keywords (if, include, define, etc) - Although the lexical analyzer treats them as identifiers, the - control line handler can recognize them as keywords by the - id_resmac field of the identifier. - */ - { - register struct mkey *mk = &mkey[0]; - - while (mk->mk_reserved) { - struct idf *idf = str2idf(mk->mk_reserved, 0); - - if (idf->id_resmac) - fatal("maximum identifier length insufficient"); - idf->id_resmac = mk->mk_key; - mk++; - } - } - - /* Initialize __DATE__, __FILE__ and __LINE__ macro - definitions. - */ - /* __DATE__ */ - clock = sys_time(); - strcpy(&date[1], ctime(&clock)); - date[26] = '\0'; /* zap nl */ - date[0] = date[25] = '"'; - macro_def(str2idf("__DATE__", 0), date, -1, 26, NOFLAG); - - /* __LINE__ */ - macro_def(str2idf("__LINE__", 0), "0", -1, 1, FUNC); - - /* __FILE__ */ - macro_def(str2idf("__FILE__", 0), "", -1, 1, FUNC); - - /* defined(??) */ - macro_def(str2idf("defined", 0), "", 1, 1, FUNC); -} diff --git a/util/cpp/input.c b/util/cpp/input.c deleted file mode 100644 index ea3cf1c6b..000000000 --- a/util/cpp/input.c +++ /dev/null @@ -1,68 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ - -#include -#include -#include -#include "file_info.h" -#include "input.h" -#define INP_TYPE struct file_info -#define INP_VAR finfo -struct file_info finfo; -#include -#include - -char * -getwdir(fn) - char *fn; -{ - register char *p; - char *strrchr(); - - p = strrchr(fn, '/'); - while (p && *(p + 1) == '\0') { /* remove trailing /'s */ - *p = '\0'; - p = strrchr(fn, '/'); - } - - if (fn[0] == '\0' || (fn[0] == '/' && p == &fn[0])) /* absolute path */ - return ""; - else - if (p) { - *p = '\0'; - fn = Salloc(fn, p - &fn[0] + 1); - *p = '/'; - return fn; - } - else return ""; -} - -int NoUnstack; -int Unstacked; -int InputLevel; - -AtEoIT() -{ - /* if (NoUnstack) warning("unexpected EOF"); ??? */ - /* This is wrong; in an #elif, NoUnstack can be set, but you - can still get calls to AtEoIT(). - */ - InputLevel--; - DoUnstack(); - return 0; -} - -AtEoIF() -{ - extern int nestlevel; - extern int nestcount; - extern int svnestlevel[]; - - if (nestlevel > svnestlevel[nestcount]) warning("missing #endif"); - else if (NoUnstack) warning("unexpected EOF"); - nestlevel = svnestlevel[nestcount--]; - return 0; -} diff --git a/util/cpp/input.h b/util/cpp/input.h deleted file mode 100644 index be425488e..000000000 --- a/util/cpp/input.h +++ /dev/null @@ -1,7 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "inputtype.h" -#include diff --git a/util/cpp/interface.h b/util/cpp/interface.h deleted file mode 100644 index 6cc8bbb86..000000000 --- a/util/cpp/interface.h +++ /dev/null @@ -1,8 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#define PRIVATE -#define IMPORT extern -#define EXPORT diff --git a/util/cpp/macro.h b/util/cpp/macro.h deleted file mode 100644 index 505c933ad..000000000 --- a/util/cpp/macro.h +++ /dev/null @@ -1,78 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* PREPROCESSOR: DEFINITION OF MACRO DESCRIPTOR */ - -/* The flags of the mc_flag field of the macro structure. Note that - these flags can be set simultaneously. -*/ -#define NOFLAG 0 /* no special flags */ -#define FUNC 01 /* function attached */ -#define NOREPLACE 02 /* don't replace */ - -#define FORMALP 0200 /* mask for creating macro formal parameter */ - -/* The macro descriptor is very simple, except the fact that the - mc_text, which points to the replacement text, contains the - non-ascii characters \201, \202, etc, indicating the position of a - formal parameter in this text. -*/ -struct macro { - struct macro *next; - char * mc_text; /* the replacement text */ - int mc_nps; /* number of formal parameters */ - int mc_length; /* length of replacement text */ - int mc_count; /* # of "concurrent" invocations*/ - char mc_flag; /* marking this macro */ -}; - - -/* allocation definitions of struct macro */ -extern char *st_alloc(); -extern struct macro *h_macro; -#ifdef DEBUG -extern int cnt_macro; -extern char *std_alloc(); -#define new_macro() ((struct macro *) std_alloc((char **)&h_macro, sizeof(struct macro), 20, &cnt_macro)) -#else -#define new_macro() ((struct macro *) st_alloc((char **)&h_macro, sizeof(struct macro), 20)) -#endif -#define free_macro(p) st_free(p, &h_macro, sizeof(struct macro)) - -struct mlist { - struct mlist *next; - struct macro *m_mac; - char *m_repl; - int m_level; -}; - -/* allocation definitions of struct mlist */ -extern char *st_alloc(); -extern struct mlist *h_mlist; -#ifdef DEBUG -extern int cnt_mlist; -extern char *std_alloc(); -#define new_mlist() ((struct mlist *) std_alloc((char **)&h_mlist, sizeof(struct mlist), 20, &cnt_mlist)) -#else -#define new_mlist() ((struct mlist *) st_alloc((char **)&h_mlist, sizeof(struct mlist), 20)) -#endif -#define free_mlist(p) st_free(p, &h_mlist, sizeof(struct mlist)) - - -/* `token' numbers of keywords of command-line processor -*/ -#define K_UNKNOWN 0 -#define K_DEFINE 1 -#define K_ELIF 2 -#define K_ELSE 3 -#define K_ENDIF 4 -#define K_IF 5 -#define K_IFDEF 6 -#define K_IFNDEF 7 -#define K_INCLUDE 8 -#define K_LINE 9 -#define K_UNDEF 10 -#define K_PRAGMA 11 -#define K_FILE 100 /* for dependency generator */ diff --git a/util/cpp/main.c b/util/cpp/main.c deleted file mode 100644 index 3d9d347c4..000000000 --- a/util/cpp/main.c +++ /dev/null @@ -1,152 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* MAIN PROGRAM */ - -#include -#include -#include -#include -#include -#include "file_info.h" -#include "idfsize.h" -#include "idf.h" -#include "macro.h" - -extern char *symbol2str(); -extern char *getwdir(); -extern int err_occurred; -extern int do_dependencies; -extern char *dep_file; -int idfsize = IDFSIZE; -extern char options[]; -static File *dep_fd = STDOUT; - -arith ifval; - -char *prog_name; - -extern char **inctable; -extern int inc_max, inc_total; - -main(argc, argv) - char *argv[]; -{ - /* parse and interpret the command line options */ - prog_name = argv[0]; - - init_idf(); - - inctable = (char **) Malloc(10 * sizeof(char *)); - inc_max = 10; - inc_total = 3; - inctable[0] = ""; - inctable[1] = "/usr/include"; - inctable[2] = 0; - init_pp(); /* initialise the preprocessor macros */ - - /* Note: source file "-" indicates that the source is supplied - as standard input. This is only allowed if INP_READ_IN_ONE is - not defined! - */ - while (argc > 1 && *argv[1] == '-' && argv[1][1] != '\0') { - char *par = &argv[1][1]; - - if (*par == '-') - par++; - do_option(par); - argc--, argv++; - } - compile(argc - 1, &argv[1]); - exit(err_occurred); -} - -compile(argc, argv) - char *argv[]; -{ - register char *source = 0; - char *dummy; - - switch (argc) { - case 1: - source = argv[0]; - FileName = source; - break; - case 0: - FileName = ""; - WorkingDir = ""; - break; - default: - FileName = argv[0]; - fatal("use: %s [options] [source]", prog_name); - break; - } - - if (!InsertFile(source, (char **) 0, &dummy)) /* read the source file */ - fatal("%s: no source file %s", prog_name, - source ? source : "stdin"); - if (source) WorkingDir = getwdir(dummy); - preprocess(source); - if (do_dependencies) list_dependencies(source); -} - -struct idf *file_head; -extern char *strrchr(); - -list_dependencies(source) - char *source; -{ - register struct idf *p = file_head; - - if (source) { - register char *s = strrchr(source, '.'); - - if (s && *(s+1)) { - s++; - *s++ = 'o'; - *s = '\0'; - /* the source may be in another directory than the - * object generated, so don't include the pathname - * leading to it. - */ - if (s = strrchr(source, '/')) { - source = s + 1; - } - } - else source = 0; - } - if (dep_file && !sys_open(dep_file, OP_WRITE, &dep_fd)) { - fatal("could not open %s", dep_file); - } - while (p) { - assert(p->id_resmac == K_FILE); - dependency(p->id_text, source); - p = p->id_file; - } -} - -add_dependency(s) - char *s; -{ - register struct idf *p = str2idf(s, 0); - - if (! p->id_resmac) { - p->id_resmac = K_FILE; - p->id_file = file_head; - file_head = p; - } -} - -dependency(s, source) - char *s, *source; -{ - if (options['i'] && !strncmp(s, "/usr/include/", 13)) { - return; - } - if (options['m'] && source) { - fprint(dep_fd, "%s: %s\n", source, s); - } - else fprint(dep_fd, "%s\n", s); -} diff --git a/util/cpp/make.hfiles b/util/cpp/make.hfiles deleted file mode 100755 index 3bc972faf..000000000 --- a/util/cpp/make.hfiles +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh -: Update Files from database - -PATH=/bin:/usr/bin - -case $# in -1) ;; -*) echo use: $0 file >&2 - exit 1 -esac - -( -IFCOMMAND="if [ -r \$FN ] ;\ - then if cmp -s \$FN \$TMP;\ - then rm \$TMP;\ - else mv \$TMP \$FN;\ - echo update \$FN;\ - fi;\ - else mv \$TMP \$FN;\ - echo create \$FN;\ - fi" -echo 'TMP=.uf$$' -echo 'FN=$TMP' -echo 'cat >$TMP <<\!EOF!' -sed -n '/^!File:/,${ -/^$/d -/^!File:[ ]*\(.*\)$/s@@!EOF!\ -'"$IFCOMMAND"'\ -FN=\1\ -cat >$TMP <<\\!EOF!@ -p -}' $1 -echo '!EOF!' -echo $IFCOMMAND -) | eval "$(cat)" diff --git a/util/cpp/make.tokcase b/util/cpp/make.tokcase deleted file mode 100755 index 6a64b2f9c..000000000 --- a/util/cpp/make.tokcase +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh - -cat <<'--EOT--' -#include "Lpars.h" - -char * -symbol2str(tok) - int tok; -{ - static char buf[2] = { '\0', '\0' }; - - if (040 <= tok && tok < 0177) { - buf[0] = tok; - buf[1] = '\0'; - return buf; - } - switch (tok) { ---EOT-- -sed ' -/{[A-Z]/!d -s/.*{\(.*\),.*\(".*"\).*$/ case \1 :\ - return \2;/ -' -cat <<'--EOT--' - case '\n': - case '\f': - case '\v': - case '\r': - case '\t': - buf[0] = tok; - return buf; - default: - return "bad token"; - } -} ---EOT-- diff --git a/util/cpp/make.tokfile b/util/cpp/make.tokfile deleted file mode 100755 index 1ee50f6c3..000000000 --- a/util/cpp/make.tokfile +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -sed ' -/{[A-Z]/!d -s/.*{// -s/,.*// -s/.*/%token &;/ -' diff --git a/util/cpp/next.c b/util/cpp/next.c deleted file mode 100644 index 5f1763fa5..000000000 --- a/util/cpp/next.c +++ /dev/null @@ -1,12 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -#include "debug.h" -struct macro *h_macro = 0; -struct mlist *h_mlist = 0; -#ifdef DEBUG -int cnt_macro = 0; -int cnt_mlist = 0; -#endif diff --git a/util/cpp/options.c b/util/cpp/options.c deleted file mode 100644 index 1d66d69fc..000000000 --- a/util/cpp/options.c +++ /dev/null @@ -1,148 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* USER-OPTION HANDLING */ - -#include -#include -#include -#include "idfsize.h" -#include "class.h" -#include "macro.h" -#include "idf.h" - -char options[128]; /* one for every char */ -int inc_pos = 1; /* place where next -I goes */ -int inc_max; -int inc_total; -int do_preprocess = 1; -int do_dependencies = 0; -char **inctable; -char *dep_file = 0; - -extern int idfsize; -int txt2int(); - -do_option(text) - char *text; -{ - switch(*text++) { - case '-': - options[*text] = 1; - break; - case 'u': - if (! strcmp(text,"ndef")) { - /* ignore -undef */ - break; - } - /* fall through */ - default: - error("illegal option: %c", text[-1]); - break; - case 'C' : /* comment output */ - case 'P' : /* run preprocessor stand-alone, without #'s */ - options[*(text-1)] = 1; - break; - case 'A' : /* for Amake */ - case 'd' : /* dependency generation */ - do_dependencies = 1; - if (*text) { - dep_file = text; - } - else { - do_preprocess = 0; - } - break; - case 'm': - case 'i': - options[*(text-1)] = 1; - break; - - case 'D' : /* -Dname : predefine name */ - { - register char *cp = text, *name, *mactext; - - if (class(*cp) != STIDF) { - error("identifier missing in -D%s", text); - break; - } - name = cp; - while (*cp && in_idf(*cp)) - ++cp; - if (!*cp) /* -Dname */ - mactext = "1"; - else - if (*cp == '=') { /* -Dname=text */ - *cp++ = '\0'; /* end of name */ - mactext = cp; - } - else { /* -Dname?? */ - error("malformed option -D%s", text); - break; - } - macro_def(str2idf(name, 0), mactext, -1, strlen(mactext), NOFLAG); - break; - } - case 'I' : /* -Ipath : insert "path" into include list */ - if (*text) { - register int i; - register char *new = text; - - if (++inc_total > inc_max) { - inctable = (char **) - Realloc((void*) inctable,(inc_max+=10)*sizeof(char *)); - } - - for(i = inc_pos++; i < inc_total; i++) { - char *tmp = inctable[i]; - - inctable[i] = new; - new = tmp; - } - } - else inctable[inc_pos] = 0; - break; - case 'M': /* maximum identifier length */ - idfsize = txt2int(&text); - if (*text) - error("malformed -M option"); - if (idfsize > IDFSIZE) { - warning("maximum identifier length is %d", IDFSIZE); - idfsize = IDFSIZE; - } - if (idfsize < 8) { - warning("minimum identifier length is 8"); - idfsize = 8; - } - break; - case 'U' : /* -Uname : undefine predefined */ - if (*text) { - register struct idf *idef = findidf(text); - - if (idef && idef->id_macro) { - free_macro(idef->id_macro); - idef->id_macro = (struct macro *) 0; - } - } - break; - } -} - -int -txt2int(tp) - char **tp; -{ - /* the integer pointed to by *tp is read, while increasing - *tp; the resulting value is yielded. - */ - register int val = 0; - register int ch; - - while (ch = **tp, ch >= '0' && ch <= '9') { - val = val * 10 + ch - '0'; - (*tp)++; - } - return val; -} diff --git a/util/cpp/preprocess.c b/util/cpp/preprocess.c deleted file mode 100644 index 5c02de124..000000000 --- a/util/cpp/preprocess.c +++ /dev/null @@ -1,264 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* PREPROCESSOR DRIVER */ - -#include -#include "input.h" -#include "obufsize.h" -#include "LLlex.h" -#include "class.h" -#include "idf.h" -#include "idfsize.h" -#include "bits.h" -#include "line_prefix.h" - -#ifdef DOBITS -char bits[128]; -#endif - -char _obuf[OBUFSIZE]; -extern int do_preprocess; - -Xflush() -{ - if (do_preprocess) sys_write(STDOUT, _obuf, OBUFSIZE); -} - -preprocess(fn) - char *fn; -{ - register int c; - register char *op = _obuf; - register char *ob = &_obuf[OBUFSIZE]; - char Xbuf[256]; - int lineno = 0; - extern char options[]; - -#define flush(X) (! do_preprocess || sys_write(STDOUT,_obuf,X)) -#define echo(ch) if (op == ob) { Xflush(); op = _obuf; } *op++ = (ch); -#define newline() echo('\n') - - if (! options['P']) { - /* Generate a line directive communicating the - source filename - */ - register char *p = Xbuf; - - sprint(p, "%s 1 \"%s\"\n", - LINE_PREFIX, - FileName); - while (*p) { - echo(*p++); - } - } - for (;;) { - LineNumber++; - lineno++; - LoadChar(c); - while (c == '#') { - domacro(); - lineno++; - newline(); - LoadChar(c); - } - if (lineno != LineNumber || fn != FileName) { - fn = FileName; - lineno = LineNumber; - if (! options['P']) { - register char *p = Xbuf; - - sprint(p, "%s %d \"%s\"\n", - LINE_PREFIX, - LineNumber, - FileName); - while (*p) { - echo(*p++); - } - } - } - for (;;) { - if (c & 0200) { - if (c == EOI) { - newline(); - flush(op-_obuf); - return; - } - fatal("non-ascii character read"); - } - if (c == '/') { - LoadChar(c); - if (c == '*') { - NoUnstack++; - if (options['C']) { - echo('/'); - echo('*'); - } - for (;;) { - LoadChar(c); - if (c == '\n') { - ++LineNumber; - ++lineno; - echo(c); - } - else if (c == EOI) { - newline(); - flush(op - _obuf); - return; - } - else if (c == '*') { - if (options['C']) { - echo(c); - } - LoadChar(c); - if (c == '/') { - if (options['C']) { - echo(c); - } - break; - } - else { - PushBack(); - } - } - else if (options['C']) { - echo(c); - } - } - NoUnstack--; - LoadChar(c); - continue; - } - echo('/'); - continue; - } - switch(class(c)) { - case STNL: - echo(c); - break; - case STSTR: - case STCHAR: { - register int stopc = c; - int escaped; - - do { - - escaped = 0; - echo(c); - LoadChar(c); - if (c == '\n') { - break; - } - else if (c == EOI) { - newline(); - flush(op-_obuf); - return; - } - if (c == '\\') { - echo(c); - LoadChar(c); - if (c == '\n') { - ++LineNumber; - lineno++; - } - else escaped = 1; - } - } while (escaped || c != stopc); - echo(c); - if (c == '\n') - break; /* Don't eat # */ - LoadChar(c); - continue; - } - case STNUM: -#define getdec(c) do { echo(c); LoadChar(c);} while (is_dig(c)) -#define gethex(c) do { echo(c); LoadChar(c);} while (is_hex(c)) - - if (c != '0') { - getdec(c); - if (c == '.') getdec(c); - if (c == 'e') { - echo(c); - LoadChar(c); - if (c == '+' || c == '-') { - echo(c); - LoadChar(c); - } - if (is_dig(c)) getdec(c); - } - } - else { - echo(c); - LoadChar(c); - if (c == 'x' || c == 'X') gethex(c); - else if (is_dig(c)) getdec(c); - } - continue; - case STIDF: { - extern int idfsize; /* ??? */ - char buf[IDFSIZE + 1]; - register char *tg = &buf[0]; - register char *maxpos = &buf[idfsize]; - register struct idf *idef; - -#define tstmac(bx) if (!(bits[c] & bx)) goto nomac -#define cpy if (Unstacked) EnableMacros(); *tg++ = c -#define load LoadChar(c); if (!in_idf(c)) goto endidf - -#ifdef DOBITS - cpy; tstmac(bit0); load; - cpy; tstmac(bit1); load; - cpy; tstmac(bit2); load; - cpy; tstmac(bit3); load; - cpy; tstmac(bit4); load; - cpy; tstmac(bit5); load; - cpy; tstmac(bit6); load; - cpy; tstmac(bit7); load; -#endif - - for(;;) { - if (tg < maxpos) { - cpy; - } - else break; - load; - } - endidf: - PushBack(); - *tg = '\0'; /* mark the end of the identifier */ - idef = findidf(buf); - if (idef && idef->id_macro) { - do { - LoadChar(c); - } while (in_idf(c)); - PushBack(); - if (replace(idef)) { - LoadChar(c); - continue; - } - } - nomac: - *tg = 0; - tg = buf; - while (*tg) { - echo(*tg++); - } - LoadChar(c); - while (in_idf(c)) { - echo(c); - LoadChar(c); - } - continue; - } - default: - echo(c); - LoadChar(c); - continue; - } - break; - } - } - /*NOTREACHED*/ -} diff --git a/util/cpp/proto.make b/util/cpp/proto.make deleted file mode 100644 index 52a04ca6f..000000000 --- a/util/cpp/proto.make +++ /dev/null @@ -1,344 +0,0 @@ -# $Id$ - -#PARAMS do not remove this line! - -SRC_DIR = $(SRC_HOME)/util/cpp - -MODULES=$(TARGET_HOME)/modules -UMODULES=$(UTIL_HOME)/modules -MODULESLIB=$(MODULES)/lib -UMODULESLIB=$(UMODULES)/lib -BIN=$(TARGET_HOME)/lib.bin - -# Libraries -SYSLIB = $(MODULESLIB)/libsystem.$(LIBSUF) -STRLIB = $(MODULESLIB)/libstring.$(LIBSUF) -PRTLIB = $(MODULESLIB)/libprint.$(LIBSUF) -ALLOCLIB = $(MODULESLIB)/liballoc.$(LIBSUF) -ASSERTLIB = $(MODULESLIB)/libassert.$(LIBSUF) -MALLOC = $(MODULESLIB)/malloc.$(SUF) -LIBS = $(PRTLIB) $(STRLIB) $(ALLOCLIB) $(MALLOC) $(ASSERTLIB) $(SYSLIB) -LINTLIBS = \ - $(UMODULESLIB)/$(LINTPREF)print.$(LINTSUF) \ - $(UMODULESLIB)/$(LINTPREF)string.$(LINTSUF) \ - $(UMODULESLIB)/$(LINTPREF)alloc.$(LINTSUF) \ - $(UMODULESLIB)/$(LINTPREF)assert.$(LINTSUF) \ - $(UMODULESLIB)/$(LINTPREF)system.$(LINTSUF) -INCLUDES = -I$(MODULES)/h -I$(MODULES)/pkg -I. -I$(SRC_DIR) - -CFLAGS = $(INCLUDES) $(COPTIONS) -LDFLAGS = $(LDOPTIONS) -LINTFLAGS = $(INCLUDES) $(LINTOPTIONS) - -# Where to install the preprocessor -CEMPP = $(BIN)/cpp - -# Grammar files and their objects -LSRC = tokenfile.g $(SRC_DIR)/expression.g -LCSRC = tokenfile.c expression.c Lpars.c -LOBJ = tokenfile.$(SUF) expression.$(SUF) Lpars.$(SUF) - -# Objects of hand-written C files -CSRC = $(SRC_DIR)/LLlex.c $(SRC_DIR)/LLmessage.c $(SRC_DIR)/ch7bin.c \ - $(SRC_DIR)/ch7mon.c $(SRC_DIR)/domacro.c $(SRC_DIR)/error.c \ - $(SRC_DIR)/idf.c $(SRC_DIR)/init.c $(SRC_DIR)/input.c \ - $(SRC_DIR)/main.c $(SRC_DIR)/options.c \ - $(SRC_DIR)/preprocess.c $(SRC_DIR)/replace.c $(SRC_DIR)/scan.c \ - $(SRC_DIR)/skip.c $(SRC_DIR)/tokenname.c $(SRC_DIR)/next.c \ - $(SRC_DIR)/expr.c -COBJ = LLlex.$(SUF) LLmessage.$(SUF) ch7bin.$(SUF) ch7mon.$(SUF) \ - domacro.$(SUF) error.$(SUF) idf.$(SUF) init.$(SUF) input.$(SUF) \ - main.$(SUF) options.$(SUF) \ - preprocess.$(SUF) replace.$(SUF) scan.$(SUF) skip.$(SUF) \ - tokenname.$(SUF) next.$(SUF) expr.$(SUF) - -PRFILES = $(SRC_DIR)/proto.make $(SRC_DIR)/Parameters \ - $(SRC_DIR)/make.hfiles $(SRC_DIR)/make.tokcase $(SRC_DIR)/make.tokfile \ - $(SRC_DIR)/LLlex.h $(SRC_DIR)/bits.h $(SRC_DIR)/file_info.h \ - $(SRC_DIR)/idf.h $(SRC_DIR)/input.h $(SRC_DIR)/interface.h \ - $(SRC_DIR)/macro.h \ - $(SRC_DIR)/class.h $(SRC_DIR)/char.tab $(SRC_DIR)/expression.g $(CSRC) - -# Objects of other generated C files -GOBJ = char.$(SUF) symbol2str.$(SUF) - -# generated source files -GSRC = char.c symbol2str.c - -# .h files generated by `make hfiles'; PLEASE KEEP THIS UP-TO-DATE! -GHSRC = errout.h idfsize.h ifdepth.h lapbuf.h \ - nparams.h numsize.h obufsize.h \ - parbufsize.h pathlength.h strsize.h textsize.h \ - botch_free.h debug.h inputtype.h dobits.h line_prefix.h - -# Other generated files, for 'make clean' only -GENERATED = tokenfile.g Lpars.h LLfiles LL.output lint.out \ - Xref hfiles cfiles - -all: cc - -cc: hfiles LLfiles - make cpp - -hfiles: Parameters char.c - $(SRC_DIR)/make.hfiles Parameters - @touch hfiles - -Parameters: $(SRC_DIR)/Parameters - cp $(SRC_DIR)/Parameters Parameters - -char.c: $(SRC_DIR)/char.tab - tabgen -f$(SRC_DIR)/char.tab > char.c - -LLfiles: $(LSRC) - LLgen $(LLGENOPTIONS) $(LSRC) - @touch LLfiles - -tokenfile.g: $(SRC_DIR)/tokenname.c $(SRC_DIR)/make.tokfile - <$(SRC_DIR)/tokenname.c $(SRC_DIR)/make.tokfile >tokenfile.g - -symbol2str.c: $(SRC_DIR)/tokenname.c $(SRC_DIR)/make.tokcase - <$(SRC_DIR)/tokenname.c $(SRC_DIR)/make.tokcase >symbol2str.c - -# Objects needed for 'cpp' -OBJ = $(COBJ) $(LOBJ) $(GOBJ) -SRC = $(CSRC) $(LCSRC) $(GSRC) - -cpp: $(OBJ) - $(CC) $(LDFLAGS) $(OBJ) $(LIBS) -o cpp - -cfiles: hfiles LLfiles $(GSRC) - @touch cfiles - -install: all - cp cpp $(CEMPP) - if [ $(DO_MACHINE_INDEP) = y ] ; \ - then mk_manpage $(SRC_DIR)/cpp.6 $(TARGET_HOME) ; \ - fi - -cmp: all - -cmp cpp $(CEMPP) - -pr: - @pr $(PRFILES) - -opr: - make pr | opr - -tags: cfiles - ctags $(SRC) - -depend: cfiles - rm_deps Makefile >Makefile.new - for i in $(SRC) ; do \ - echo "`basename $$i .c`.$$(SUF): $$i" >> Makefile.new ; \ - echo ' $$(CC) -c $$(CFLAGS)' $$i >> Makefile.new ; \ - $(UTIL_HOME)/lib.bin/cpp -d $(INCLUDES) $$i | sed "s/^/`basename $$i .c`.$$(SUF): /" >> Makefile.new ; \ - done - mv Makefile Makefile.old - mv Makefile.new Makefile - -lint: cfiles - $(LINT) $(LINTFLAGS) $(INCLUDES) $(SRC) $(LINTLIBS) - -clean: - rm -f $(LCSRC) $(OBJ) $(GENERATED) $(GSRC) $(GHSRC) cpp Out - -# do not remove the next line. It is used for generating dependencies. -#DEPENDENCIES -LLlex.$(SUF): $(SRC_DIR)/LLlex.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/LLlex.c -LLlex.$(SUF): ./dobits.h -LLlex.$(SUF): $(SRC_DIR)/bits.h -LLlex.$(SUF): $(SRC_DIR)/class.h -LLlex.$(SUF): ./Lpars.h -LLlex.$(SUF): $(SRC_DIR)/file_info.h -LLlex.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -LLlex.$(SUF): $(SRC_DIR)/LLlex.h -LLlex.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.spec -LLlex.$(SUF): $(SRC_DIR)/idf.h -LLlex.$(SUF): $(TARGET_HOME)/modules/pkg/inp_pkg.spec -LLlex.$(SUF): ./inputtype.h -LLlex.$(SUF): $(SRC_DIR)/input.h -LLlex.$(SUF): $(TARGET_HOME)/modules/h/alloc.h -LLlex.$(SUF): ./strsize.h -LLlex.$(SUF): ./numsize.h -LLlex.$(SUF): ./idfsize.h -LLmessage.$(SUF): $(SRC_DIR)/LLmessage.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/LLmessage.c -LLmessage.$(SUF): ./Lpars.h -LLmessage.$(SUF): $(SRC_DIR)/file_info.h -LLmessage.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -LLmessage.$(SUF): $(SRC_DIR)/LLlex.h -ch7bin.$(SUF): $(SRC_DIR)/ch7bin.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/ch7bin.c -ch7bin.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -ch7bin.$(SUF): ./Lpars.h -ch7mon.$(SUF): $(SRC_DIR)/ch7mon.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/ch7mon.c -ch7mon.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -ch7mon.$(SUF): ./Lpars.h -domacro.$(SUF): $(SRC_DIR)/domacro.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/domacro.c -domacro.$(SUF): ./dobits.h -domacro.$(SUF): $(SRC_DIR)/bits.h -domacro.$(SUF): $(SRC_DIR)/macro.h -domacro.$(SUF): $(SRC_DIR)/class.h -domacro.$(SUF): $(TARGET_HOME)/modules/h/alloc.h -domacro.$(SUF): $(TARGET_HOME)/modules/h/assert.h -domacro.$(SUF): ./idfsize.h -domacro.$(SUF): ./textsize.h -domacro.$(SUF): ./parbufsize.h -domacro.$(SUF): ./nparams.h -domacro.$(SUF): ./botch_free.h -domacro.$(SUF): ./ifdepth.h -domacro.$(SUF): $(TARGET_HOME)/modules/pkg/inp_pkg.spec -domacro.$(SUF): ./inputtype.h -domacro.$(SUF): $(SRC_DIR)/input.h -domacro.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.spec -domacro.$(SUF): $(SRC_DIR)/idf.h -domacro.$(SUF): ./debug.h -domacro.$(SUF): ./Lpars.h -domacro.$(SUF): $(SRC_DIR)/file_info.h -domacro.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -domacro.$(SUF): $(SRC_DIR)/LLlex.h -domacro.$(SUF): $(SRC_DIR)/interface.h -error.$(SUF): $(SRC_DIR)/error.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/error.c -error.$(SUF): $(SRC_DIR)/file_info.h -error.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -error.$(SUF): $(SRC_DIR)/LLlex.h -error.$(SUF): ./errout.h -error.$(SUF): $(TARGET_HOME)/modules/h/system.h -idf.$(SUF): $(SRC_DIR)/idf.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/idf.c -idf.$(SUF): $(TARGET_HOME)/modules/h/alloc.h -idf.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.body -idf.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.spec -idf.$(SUF): $(SRC_DIR)/idf.h -init.$(SUF): $(SRC_DIR)/init.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/init.c -init.$(SUF): $(SRC_DIR)/interface.h -init.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.spec -init.$(SUF): $(SRC_DIR)/idf.h -init.$(SUF): $(SRC_DIR)/macro.h -init.$(SUF): $(SRC_DIR)/class.h -init.$(SUF): $(TARGET_HOME)/modules/h/alloc.h -init.$(SUF): $(TARGET_HOME)/modules/h/system.h -input.$(SUF): $(SRC_DIR)/input.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/input.c -input.$(SUF): $(TARGET_HOME)/modules/h/system.h -input.$(SUF): $(TARGET_HOME)/modules/h/alloc.h -input.$(SUF): $(TARGET_HOME)/modules/pkg/inp_pkg.body -input.$(SUF): $(TARGET_HOME)/modules/pkg/inp_pkg.spec -input.$(SUF): ./inputtype.h -input.$(SUF): $(SRC_DIR)/input.h -input.$(SUF): $(SRC_DIR)/file_info.h -main.$(SUF): $(SRC_DIR)/main.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/main.c -main.$(SUF): $(SRC_DIR)/macro.h -main.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.spec -main.$(SUF): $(SRC_DIR)/idf.h -main.$(SUF): ./idfsize.h -main.$(SUF): $(SRC_DIR)/file_info.h -main.$(SUF): $(TARGET_HOME)/modules/h/system.h -main.$(SUF): $(TARGET_HOME)/modules/h/assert.h -main.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -main.$(SUF): $(TARGET_HOME)/modules/h/alloc.h -options.$(SUF): $(SRC_DIR)/options.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/options.c -options.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.spec -options.$(SUF): $(SRC_DIR)/idf.h -options.$(SUF): $(SRC_DIR)/macro.h -options.$(SUF): $(SRC_DIR)/class.h -options.$(SUF): ./idfsize.h -options.$(SUF): $(TARGET_HOME)/modules/h/alloc.h -preprocess.$(SUF): $(SRC_DIR)/preprocess.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/preprocess.c -preprocess.$(SUF): ./line_prefix.h -preprocess.$(SUF): ./dobits.h -preprocess.$(SUF): $(SRC_DIR)/bits.h -preprocess.$(SUF): ./idfsize.h -preprocess.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.spec -preprocess.$(SUF): $(SRC_DIR)/idf.h -preprocess.$(SUF): $(SRC_DIR)/class.h -preprocess.$(SUF): $(SRC_DIR)/file_info.h -preprocess.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -preprocess.$(SUF): $(SRC_DIR)/LLlex.h -preprocess.$(SUF): ./obufsize.h -preprocess.$(SUF): $(TARGET_HOME)/modules/pkg/inp_pkg.spec -preprocess.$(SUF): ./inputtype.h -preprocess.$(SUF): $(SRC_DIR)/input.h -preprocess.$(SUF): $(TARGET_HOME)/modules/h/system.h -replace.$(SUF): $(SRC_DIR)/replace.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/replace.c -replace.$(SUF): $(SRC_DIR)/interface.h -replace.$(SUF): $(SRC_DIR)/class.h -replace.$(SUF): $(SRC_DIR)/file_info.h -replace.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -replace.$(SUF): $(SRC_DIR)/LLlex.h -replace.$(SUF): $(SRC_DIR)/macro.h -replace.$(SUF): $(TARGET_HOME)/modules/pkg/inp_pkg.spec -replace.$(SUF): ./inputtype.h -replace.$(SUF): $(SRC_DIR)/input.h -replace.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.spec -replace.$(SUF): $(SRC_DIR)/idf.h -replace.$(SUF): $(TARGET_HOME)/modules/h/assert.h -replace.$(SUF): $(TARGET_HOME)/modules/h/alloc.h -replace.$(SUF): ./textsize.h -replace.$(SUF): ./pathlength.h -replace.$(SUF): ./debug.h -scan.$(SUF): $(SRC_DIR)/scan.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/scan.c -scan.$(SUF): $(SRC_DIR)/file_info.h -scan.$(SUF): $(SRC_DIR)/interface.h -scan.$(SUF): $(SRC_DIR)/macro.h -scan.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.spec -scan.$(SUF): $(SRC_DIR)/idf.h -scan.$(SUF): $(SRC_DIR)/class.h -scan.$(SUF): $(TARGET_HOME)/modules/pkg/inp_pkg.spec -scan.$(SUF): ./inputtype.h -scan.$(SUF): $(SRC_DIR)/input.h -scan.$(SUF): ./nparams.h -scan.$(SUF): ./lapbuf.h -skip.$(SUF): $(SRC_DIR)/skip.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/skip.c -skip.$(SUF): $(TARGET_HOME)/modules/pkg/inp_pkg.spec -skip.$(SUF): ./inputtype.h -skip.$(SUF): $(SRC_DIR)/input.h -skip.$(SUF): $(SRC_DIR)/class.h -skip.$(SUF): $(SRC_DIR)/file_info.h -skip.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -skip.$(SUF): $(SRC_DIR)/LLlex.h -tokenname.$(SUF): $(SRC_DIR)/tokenname.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/tokenname.c -tokenname.$(SUF): ./Lpars.h -tokenname.$(SUF): $(SRC_DIR)/file_info.h -tokenname.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -tokenname.$(SUF): $(SRC_DIR)/LLlex.h -tokenname.$(SUF): $(TARGET_HOME)/modules/pkg/idf_pkg.spec -tokenname.$(SUF): $(SRC_DIR)/idf.h -next.$(SUF): $(SRC_DIR)/next.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/next.c -next.$(SUF): ./debug.h -expr.$(SUF): $(SRC_DIR)/expr.c - $(CC) -c $(CFLAGS) $(SRC_DIR)/expr.c -expr.$(SUF): ./Lpars.h -tokenfile.$(SUF): tokenfile.c - $(CC) -c $(CFLAGS) tokenfile.c -tokenfile.$(SUF): Lpars.h -expression.$(SUF): expression.c - $(CC) -c $(CFLAGS) expression.c -expression.$(SUF): $(SRC_DIR)/file_info.h -expression.$(SUF): $(TARGET_HOME)/modules/h/em_arith.h -expression.$(SUF): $(SRC_DIR)/LLlex.h -expression.$(SUF): Lpars.h -Lpars.$(SUF): Lpars.c - $(CC) -c $(CFLAGS) Lpars.c -Lpars.$(SUF): Lpars.h -char.$(SUF): char.c - $(CC) -c $(CFLAGS) char.c -char.$(SUF): $(SRC_DIR)/class.h -symbol2str.$(SUF): symbol2str.c - $(CC) -c $(CFLAGS) symbol2str.c -symbol2str.$(SUF): Lpars.h diff --git a/util/cpp/replace.c b/util/cpp/replace.c deleted file mode 100644 index 2c3eec830..000000000 --- a/util/cpp/replace.c +++ /dev/null @@ -1,243 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* PREPROCESSOR: MACRO-TEXT REPLACEMENT ROUTINES */ - -#include -#include -#include "debug.h" /* UF */ -#include "pathlength.h" /* UF */ -#include "textsize.h" /* UF */ - -#include -#include -#include "idf.h" -#include "input.h" -#include "macro.h" -#include "LLlex.h" -#include "class.h" -#include "interface.h" - -char *long2str(); -extern int InputLevel; - -PRIVATE struct mlist *ReplList; /* list of currently active macros */ - -EXPORT int -replace(idef) - register struct idf *idef; -{ - /* replace() is called by the lexical analyzer to perform - macro replacement. "idef" is the description of the - identifier which leads to the replacement. If the - optional actual parameters of the macro are OK, the text - of the macro is prepared to serve as an input buffer, - which is pushed onto the input stack. - replace() returns 1 if the replacement succeeded and 0 if - some error has occurred. - */ - register struct macro *mac = idef->id_macro; - register char c; - char **actpars, **getactuals(); - char *reptext, *macro2buffer(); - register struct mlist *repl; - int size; - - if (mac->mc_flag & NOREPLACE) { - warning("macro %s is recursive", idef->id_text); - return 0; - } - if (mac->mc_nps != -1) { /* with parameter list */ - if (mac->mc_flag & FUNC) { - /* must be "defined". - Unfortunately, the next assertion - will not compile ... - assert( ! strcmp("defined", idef->id_text)); - */ - if (! AccDefined) - return 0; - } - if (++mac->mc_count > 100) { - /* 100 must be some number in parameters.h */ - warning("macro %s is assumed recursive", - idef->id_text); - return 0; - } - LoadChar(c); - c = skipspaces(c,! (mac->mc_flag & FUNC)); - if (c != '(') { /* no replacement if no () */ - PushBack(); - if (! (mac->mc_flag & FUNC)) { - warning("macro %s needs arguments", - idef->id_text); - return 0; - } - } - if (mac->mc_flag & FUNC) { - struct idf *param; - char *nam; - extern char *GetIdentifier(); - - UnknownIdIsZero = 0; - nam = GetIdentifier(); - if (nam) { - param = findidf(nam); - } - else param = 0; - UnknownIdIsZero = 1; - if (c == '(') { - LoadChar(c); - c = skipspaces(c, 0); - if (c != ')') error(") missing"); - } - if (! nam) { - error("identifier missing"); - } - repl = new_mlist(); - if (param && param->id_macro) - reptext = "1 "; - else - reptext = "0 "; - InsertText(reptext, 2); - InputLevel++; - repl->m_level = InputLevel; - - repl->next = ReplList; - ReplList = repl; - repl->m_mac = mac; - if (nam) free(nam); - return 1; - } - actpars = getactuals(idef); /* get act.param. list */ - } - - repl = new_mlist(); - repl->m_mac = mac; - if (mac->mc_flag & FUNC) /* this macro leads to special action */ - macro_func(idef); - if (mac->mc_nps <= 0) { - reptext = mac->mc_text; - size = mac->mc_length; - mac->mc_flag |= NOREPLACE; /* a file called __FILE__ ??? */ - } - else { - reptext = macro2buffer(idef, actpars, &size); /* create input buffer */ - repl->m_repl = reptext; - } - InsertText(reptext, size); - InputLevel++; - repl->m_level = InputLevel; - repl->next = ReplList; - ReplList = repl; - return 1; -} - -char FilNamBuf[PATHLENGTH]; - -PRIVATE -macro_func(idef) - register struct idf *idef; -{ - /* macro_func() performs the special actions needed with some - macros. These macros are __FILE__ and __LINE__ which - replacement texts must be evaluated at the time they are - used. - */ - register struct macro *mac = idef->id_macro; - - switch (idef->id_text[2]) { /* This switch is very blunt... */ - case 'F' : /* __FILE__ */ - mac->mc_length = strlen(FileName) + 2; - mac->mc_text = FilNamBuf; - mac->mc_text[0] = '"'; - strcpy(&(mac->mc_text[1]), FileName); - strcat(mac->mc_text, "\""); - break; - case 'L' : /* __LINE__ */ - { - mac->mc_text = long2str((long) LineNumber, 10); - mac->mc_length = strlen(mac->mc_text); - break; - } - default : - crash("(macro_func)"); - } -} - -PRIVATE char * -macro2buffer(idef, actpars, siztext) - struct idf *idef; - char **actpars; - int *siztext; -{ - /* Macro2buffer() turns the macro replacement text, as it is - stored, into an input buffer, while each occurrence of the - non-ascii formal parameter mark is replaced by its - corresponding actual parameter specified in the actual - parameter list actpars. A pointer to the beginning of the - constructed text is returned, while *siztext is filled - with its length. - If there are no parameters, this function behaves - the same as strcpy(). - */ - register unsigned int size = idef->id_macro->mc_length + ITEXTSIZE; - register char *text = Malloc(size); - register int pos = 0; - register char *ptr = idef->id_macro->mc_text; - - while (*ptr) { - if (*ptr & FORMALP) { /* non-asc formal param. mark */ - register int n = *ptr++ & 0177; - register char *p; - - assert(n != 0); - /* copy the text of the actual parameter - into the replacement text - */ - for (p = actpars[n - 1]; *p; p++) { - text[pos++] = *p; - if (pos == size) - text = Realloc(text, size <<= 1); - } - } - else { - text[pos++] = *ptr++; - if (pos == size) - text = Realloc(text, size <<= 1); - } - } - text[pos] = '\0'; - *siztext = pos; - return Realloc(text, pos+1); -} - -EXPORT -DoUnstack() -{ - Unstacked = 1; -} - -EXPORT -EnableMacros() -{ - register struct mlist *p = ReplList, *prev = 0; - - assert(Unstacked > 0); - while (p) { - struct mlist *nxt = p->next; - - if (p->m_level > InputLevel) { - p->m_mac->mc_flag &= ~NOREPLACE; - if (p->m_mac->mc_count) p->m_mac->mc_count--; - if (p->m_repl) free(p->m_repl); - if (! prev) ReplList = nxt; - else prev->next = nxt; - free_mlist(p); - } - else prev = p; - p = nxt; - } - Unstacked = 0; -} diff --git a/util/cpp/scan.c b/util/cpp/scan.c deleted file mode 100644 index 78c5b221e..000000000 --- a/util/cpp/scan.c +++ /dev/null @@ -1,237 +0,0 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* PREPROCESSOR: SCANNER FOR THE ACTUAL PARAMETERS OF MACROS */ - -/* This file contains the function getactuals() which scans an actual - parameter list and splits it up into a list of strings, each one - representing an actual parameter. -*/ - -#include "lapbuf.h" /* UF */ -#include "nparams.h" /* UF */ - -#include "input.h" -#include "class.h" -#include "idf.h" -#include "macro.h" -#include "interface.h" -#include "file_info.h" - -#define EOS '\0' -#define overflow() (fatal("actual parameter buffer overflow")) - -PRIVATE char apbuf[LAPBUF]; /* temporary storage for actual parameters */ -PRIVATE char *actparams[NPARAMS]; /* pointers to the text of the actuals */ -PRIVATE char *aptr; /* pointer to last inserted character in apbuf */ - -#define copy(ch) ((aptr < &apbuf[LAPBUF]) ? (*aptr++ = ch) : overflow()) - -PRIVATE int nr_of_params; /* number of actuals read until now */ - -PRIVATE char ** -getactuals(idef) - struct idf *idef; -{ - /* getactuals() collects the actual parameters and turns them - into a list of strings, a pointer to which is returned. - */ - register acnt = idef->id_macro->mc_nps; - - nr_of_params = 0; - actparams[0] = aptr = &apbuf[0]; - copyact('(', ')', 0); /* read the actual parameters */ - copy(EOS); /* mark the end of it all */ - - if (!nr_of_params++) { /* 0 or 1 parameter */ - /* there could be a ( ) - */ - register char *p = actparams[0]; - - while ((class(*p) == STSKIP) || (*p == '\n')) { - ++p; - } - - if (!*p) { /* the case () : 0 parameters */ - nr_of_params--; - } - } - - if (nr_of_params != acnt) { - /* argument mismatch: too many or too few - actual parameters. - */ - warning("argument mismatch, %s", idef->id_text); - - while (nr_of_params < acnt) { - /* too few paraeters: remaining actuals are "" - */ - actparams[nr_of_params] = ""; - nr_of_params++; - } - } - - return actparams; -} - -PRIVATE -copyact(ch1, ch2, level) - char ch1, ch2; - int level; -{ - /* copyact() is taken from Ceriel Jacobs' LLgen, with - permission. Its task is to build a list of actuals - parameters, which list is surrounded by '(' and ')' and in - which the parameters are separated by ',' if there are - more than 1. The balancing of '(',')' and '[',']' and - '{','}' is taken care of by calling this function - recursively. At each level, copyact() reads the input, - upto the corresponding closing bracket. - - Opening bracket is ch1, closing bracket is ch2. If - level != 0, copy opening and closing parameters too. - */ - register int ch; /* Current char */ - register int match; /* used to read strings */ - - if (level) { - copy(ch1); - } - - for (;;) { - LoadChar(ch); - - if (ch == ch2) { - if (level) { - copy(ch); - } - return; - } - - switch(ch) { - -#ifdef __MATCHING_PAR__ - case ')': - case '}': - case ']': - error("unbalanced parenthesis"); - break; -#endif /* __MATCHING_PAR__ */ - - case '(': - copyact('(', ')', level+1); - break; - -#ifdef __MATCHING_PAR__ - case '{': - /* example: - #define declare(v, t) t v - declare(v, union{int i, j; float r;}); - */ - copyact('{', '}', level+1); - break; - - case '[': - copyact('[', ']', level+1); - break; -#endif /* __MATCHING_PAR__ */ - - case '\n': - LineNumber++; - LoadChar(ch); - while (ch == '#') { - /* This piece of code needs some - explanation: consider the call of - the macro defined as: - #define sum(b,c) (b + c) - in the following form: - sum( - #include my_phone_number - ,2) - in which case the include must be - interpreted as such. - */ - domacro(); /* has read nl, vt or ff */ - LoadChar(ch); - /* Loop, for another control line */ - } - - PushBack(); - copy(' '); - break; - - case '/': - LoadChar(ch); - - if (ch == '*') { /* skip comment */ - skipcomment(); - continue; - } - - PushBack(); - copy('/'); - break; - - case ',': - if (!level) { - /* next parameter encountered */ - copy(EOS); - - if (++nr_of_params >= NPARAMS) { - fatal("(getact) too many actuals"); - } - - actparams[nr_of_params] = aptr; - } - else { - copy(ch); - } - break; - - case '\'': - case '"' : - /* watch out for brackets in strings, they do - not count ! - */ - match = ch; - copy(ch); - LoadChar(ch); - while (ch != EOI) { - if (ch == match) { - break; - } - - if (ch == '\\') { - copy(ch); - LoadChar(ch); - } - else - if (ch == '\n') { - LineNumber++; - error("newline in string"); - copy(match); - break; - } - - copy(ch); - LoadChar(ch); - } - - if (ch == match) { - copy(ch); - break; - } - /* Fall through */ - - case EOI : - error("unterminated macro call"); - return; - - default: - copy(ch); - break; - } - } -} diff --git a/util/cpp/skip.c b/util/cpp/skip.c deleted file mode 100644 index 86e94706d..000000000 --- a/util/cpp/skip.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* $Id$ */ -/* PREPROCESSOR: INPUT SKIP FUNCTIONS */ - -#include "LLlex.h" -#include "class.h" -#include "input.h" - -int -skipspaces(ch, skipnl) - register int ch; -{ - /* skipspaces() skips any white space and returns the first - non-space character. - */ - register int nlseen = 0; - - for (;;) { - while (class(ch) == STSKIP) { - nlseen = 0; - LoadChar(ch); - } - if (skipnl && class(ch) == STNL) { - LoadChar(ch); - ++LineNumber; - nlseen++; - continue; - } - /* How about "\\\n"????????? */ - if (ch == '/') { - LoadChar(ch); - if (ch == '*') { - skipcomment(); - LoadChar(ch); - } - else { - PushBack(); - return '/'; - } - } - else if (nlseen && ch == '#') { - domacro(); - LoadChar(ch); - /* ch is the first character of a line. This means - * that nlseen will still be true. - */ - } else - return ch; - } -} - -skipline() -{ - /* skipline() skips all characters until a newline character - is seen, not escaped by a '\\'. - Any comment is skipped. - */ - register int c; - - LoadChar(c); - while (class(c) != STNL && c != EOI) { - if (class(c) == STSTR || class(c) == STCHAR) { - register int stopc = c; - int escaped; - do { - escaped = 0; - LoadChar(c); - if (class(c) == STNL || c == EOI) { - break; - } - if (c == '\\') { - LoadChar(c); - if (c == '\n') { - ++LineNumber; - } - else escaped = 1; - } - } while (escaped || c != stopc); - if (class(c) != STNL && c != EOI) { - LoadChar(c); - } - continue; - } - if (c == '\\') { - LoadChar(c); - if (class(c) == STNL) - ++LineNumber; - } - if (c == '/') { - LoadChar(c); - if (c == '*') - skipcomment(); - else - continue; - } - LoadChar(c); - } - ++LineNumber; - if (c == EOI) { /* garbage input... */ - error("unexpected EOF while skipping text"); - PushBack(); - } -} diff --git a/util/cpp/tokenname.c b/util/cpp/tokenname.c deleted file mode 100644 index a4612c5d1..000000000 --- a/util/cpp/tokenname.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* $Id$ */ -/* TOKEN NAME DEFINITIONS */ - -#include "idf.h" -#include "LLlex.h" -#include "Lpars.h" - -struct tokenname { /* Used for defining the name of a - token as identified by its symbol - */ - int tn_symbol; - char *tn_name; -}; - -/* To centralize the declaration of %tokens, their presence in this - file is taken as their declaration. The Makefile will produce - a grammar file (tokenfile.g) from this file. - Moreover, rather than looking up a symbol in all these lists - to find its printable name, a fast version of symbol2str() is - generated from these tables. - Consequenty some of these tables are not referenced explicitly - in the C text any more. To save space and to avoid lint confusion, - these have been made pseudo-invisible by #ifdefs. -*/ - -#ifdef ____ -struct tokenname tkspec[] = { /* the names of the special tokens */ - {IDENTIFIER, "identifier"}, - {STRING, "string"}, - {FILESPECIFIER, "filespecifier"}, - {INTEGER, "integer"}, - {0, ""} -}; - -struct tokenname tkcomp[] = { /* names of the composite tokens */ - {NOTEQUAL, "!="}, - {AND, "&&"}, - {LEFT, "<<"}, - {LESSEQ, "<="}, - {EQUAL, "=="}, - {GREATEREQ, ">="}, - {RIGHT, ">>"}, - {OR, "||"}, - {0, ""} -}; - -struct tokenname tkfunny[] = { /* internal keywords */ - {ERRONEOUS, "erroneous"}, - {0, ""} -}; -#endif /* ____ */ diff --git a/util/ego/build.lua b/util/ego/build.lua index 97f177822..8749fe40d 100644 --- a/util/ego/build.lua +++ b/util/ego/build.lua @@ -14,17 +14,261 @@ local function build_ego(name) } end -build_ego("bo") -build_ego("ca") -build_ego("cf") -build_ego("cj") -build_ego("cs") -build_ego("ic") -build_ego("il") -build_ego("lv") -build_ego("sp") -build_ego("sr") -build_ego("ud") +cprogram { + name = "bo", + srcs = { + "./bo/bo.c", + }, + deps = { + "util/ego/share+lib", + "modules/src/em_data+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} + +cprogram { + name = "ca", + srcs = { + "./ca/ca.c", + "./ca/ca_put.c", + }, + deps = { + "./ca/ca.h", + "./ca/ca_put.h", + "util/ego/share+lib", + "modules/src/em_data+lib", + "modules/src/data+lib", + "modules/src/system+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} + +cprogram { + name = "cf", + srcs = { + "./cf/cf.c", + "./cf/cf_idom.c", + "./cf/cf_loop.c", + "./cf/cf_succ.c", + + }, + deps = { + "./cf/cf.h", + "./cf/cf_idom.h", + "./cf/cf_loop.h", + "./cf/cf_succ.h", + "util/ego/share+lib", + "modules/src/em_data+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} + +cprogram { + name = "cj", + srcs = { + "./cj/cj.c", + }, + deps = { + "util/ego/share+lib", + "modules/src/em_data+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} + +cprogram { + name = "cs", + srcs = { + "./cs/cs_alloc.c", + "./cs/cs_aux.c", + "./cs/cs_avail.c", + "./cs/cs.c", + "./cs/cs_debug.c", + "./cs/cs_elim.c", + "./cs/cs_entity.c", + "./cs/cs_getent.c", + "./cs/cs_kill.c", + "./cs/cs_partit.c", + "./cs/cs_profit.c", + "./cs/cs_stack.c", + "./cs/cs_vnm.c", + }, + deps = { + "./cs/cs_alloc.h", + "./cs/cs_aux.h", + "./cs/cs_avail.h", + "./cs/cs_debug.h", + "./cs/cs_elim.h", + "./cs/cs_entity.h", + "./cs/cs_getent.h", + "./cs/cs.h", + "./cs/cs_kill.h", + "./cs/cs_partit.h", + "./cs/cs_profit.h", + "./cs/cs_stack.h", + "./cs/cs_vnm.h", + "util/ego/share+lib", + "modules/src/em_data+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} + +cprogram { + name = "ic", + srcs = { + "./ic/ic_aux.c", + "./ic/ic.c", + "./ic/ic_io.c", + "./ic/ic_lib.c", + "./ic/ic_lookup.c", + }, + deps = { + "./ic/ic_aux.h", + "./ic/ic.h", + "./ic/ic_io.h", + "./ic/ic_lib.h", + "./ic/ic_lookup.h", + "util/ego/share+lib", + "modules/src/em_data+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} + +cprogram { + name = "il", + srcs = { + "./il/il1_anal.c", + "./il/il1_aux.c", + "./il/il1_cal.c", + "./il/il1_formal.c", + "./il/il2_aux.c", + "./il/il3_aux.c", + "./il/il3_change.c", + "./il/il3_subst.c", + "./il/il_aux.c", + "./il/il.c", + }, + deps = { + "./il/il1_anal.h", + "./il/il1_aux.h", + "./il/il1_cal.h", + "./il/il1_formal.h", + "./il/il2_aux.h", + "./il/il3_aux.h", + "./il/il3_change.h", + "./il/il3_subst.h", + "./il/il_aux.h", + "./il/il.h", + "util/ego/share+lib", + "modules/src/em_data+lib", + "modules/src/data+lib", + "modules/src/system+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} + +cprogram { + name = "lv", + srcs = { + "./lv/lv.c", + }, + deps = { + "./lv/lv.h", + "util/ego/share+lib", + "modules/src/em_data+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} + +cprogram { + name = "sp", + srcs = { + "./sp/sp.c", + }, + deps = { + "util/ego/share+lib", + "modules/src/em_data+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} + +cprogram { + name = "sr", + srcs = { + "./sr/sr_aux.c", + "./sr/sr.c", + "./sr/sr_cand.c", + "./sr/sr_expr.c", + "./sr/sr_iv.c", + "./sr/sr_reduce.c", + "./sr/sr_xform.c", + }, + deps = { + "./sr/sr_aux.h", + "./sr/sr_cand.h", + "./sr/sr_expr.h", + "./sr/sr.h", + "./sr/sr_iv.h", + "./sr/sr_reduce.h", + "./sr/sr_xform.h", + "util/ego/share+lib", + "modules/src/em_data+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} + +cprogram { + name = "ud", + srcs = { + "./ud/ud_aux.c", + "./ud/ud.c", + "./ud/ud_const.c", + "./ud/ud_copy.c", + "./ud/ud_defs.c", + }, + deps = { + "./ud/ud_aux.h", + "./ud/ud_const.h", + "./ud/ud_copy.h", + "./ud/ud_defs.h", + "./ud/ud.h", + "util/ego/share+lib", + "modules/src/em_data+lib", + "h+emheaders", + }, + vars = { + ["+cflags"] = {"-DDEBUG", "-DVERBOSE", "-DNOTCOMPACT"} + } +} cprogram { name = "em_ego", @@ -33,6 +277,7 @@ cprogram { "modules/src/print+lib", "modules/src/string+lib", "modules/src/system+lib", + "modules/src/data+lib", "modules+headers", "h+emheaders", } diff --git a/util/ego/ca/ca.c b/util/ego/ca/ca.c index 1bf73d24a..27e517818 100644 --- a/util/ego/ca/ca.c +++ b/util/ego/ca/ca.c @@ -13,6 +13,7 @@ #include #include #include +#include "system.h" #include "../share/types.h" #include "ca.h" #include "../share/debug.h" @@ -173,7 +174,7 @@ STATIC void getpnames(dumpp) } } -STATIC new_name(s) char** s; +STATIC int new_name(s) char** s; { static int nn = 0; char buf[20]; @@ -189,7 +190,7 @@ STATIC new_name(s) char** s; strcpy(*s, buf); } -STATIC uniq_names() +STATIC int uniq_names() { /* The names of all internal procedures and data blocks * are made different. As the optimizer combines several @@ -217,7 +218,7 @@ STATIC uniq_names() } } -main(argc, argv) int argc; +int main(argc, argv) int argc; char* argv[]; { /* CA does not output proctable etc. files. Instead, its @@ -257,15 +258,16 @@ char* argv[]; fproc = getptable(pname_in); /* proc table */ fdblock = getdtable(dname_in); /* data block table */ dlength = makedmap(fdblock); /* allocate dmap table */ - df = openfile(dname_out, "r"); + df = openfile(dname_out, "rb"); getdnames(df); fclose(df); - pf = openfile(pname_out, "r"); + pf = openfile(pname_out, "rb"); getpnames(pf); fclose(pf); uniq_names(); - f = openfile(lname_in, "r"); + f = openfile(lname_in, "rb"); f2 = stdout; + sys_setbinarymode(f2); cputmagic(f2); /* write magic number */ while ((lnp = get_ca_lines(f, &curproc)) != (line_p)0) { diff --git a/util/ego/ca/ca_put.c b/util/ego/ca/ca_put.c index d89d0578e..246a01a96 100644 --- a/util/ego/ca/ca_put.c +++ b/util/ego/ca/ca_put.c @@ -71,13 +71,13 @@ STATIC void outsym(const char *s, int t) coutshort((short) num); } } else { - p= s; + p= (byte*) s; while (*p && p < &s[IDL]) p++; num = p - s; outbyte( (byte) t); coutint((short) num); - p = s; + p = (byte*) s; while (num--) outbyte( (byte) *p++ ); } @@ -167,7 +167,7 @@ STATIC void coutobject(obj_p obj) STATIC void cputstr(argb_p abp) { register argb_p tbp; - register length; + register int length; length = 0; tbp = abp; diff --git a/util/ego/cf/cf.c b/util/ego/cf/cf.c index 6ee94af46..1f10e24ed 100644 --- a/util/ego/cf/cf.c +++ b/util/ego/cf/cf.c @@ -557,15 +557,15 @@ char* argv[]; fdblock = getdtable(dname_in); /* data block table */ lpi_set = Cempty_set(plength); cai_set = Cempty_set(plength); - if ((f = fopen(lname_in, "r")) == NULL) + if ((f = fopen(lname_in, "rb")) == NULL) { error("cannot open %s", lname_in); } - if ((f2 = fopen(lname_out, "w")) == NULL) + if ((f2 = fopen(lname_out, "wb")) == NULL) { error("cannot open %s", lname_out); } - if ((gf2 = fopen(bname_out, "w")) == NULL) + if ((gf2 = fopen(bname_out, "wb")) == NULL) { error("cannot open %s", bname_out); } @@ -603,12 +603,12 @@ char* argv[]; /* Compute transitive closure of used/changed * variables information for every procedure. */ - if ((f = fopen(dname_out, "w")) == NULL) + if ((f = fopen(dname_out, "wb")) == NULL) { error("cannot open %s", dname_out); } putdtable(fdblock, f); - if ((f = fopen(pname_out, "w")) == NULL) + if ((f = fopen(pname_out, "wb")) == NULL) { error("cannot open %s", pname_out); } diff --git a/util/ego/em_ego/em_ego.c b/util/ego/em_ego/em_ego.c index e9f9eb9f8..1946966f2 100644 --- a/util/ego/em_ego/em_ego.c +++ b/util/ego/em_ego/em_ego.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include "em_path.h" @@ -60,10 +59,10 @@ static const struct #define MAXARGS 1024 /* mar # of args */ #define NTEMPS 4 /* # of temporary files; not tunable */ -static char tmpbase[NAME_MAX]; -static char ddump[NAME_MAX]; /* data label dump file */ -static char pdump[NAME_MAX]; /* procedure name dump file */ -static char tmpbufs[NTEMPS * 2][NAME_MAX]; +static char* tmpbase; +static char ddump[PATH_MAX]; /* data label dump file */ +static char pdump[PATH_MAX]; /* procedure name dump file */ +static char tmpbufs[NTEMPS * 2][PATH_MAX]; static int O2phases[] = { /* Passes for -O2 */ CJ, BO, SP, 0 @@ -281,7 +280,7 @@ static void if (descr_file) { phargs[argc++] = "-M"; - phargs[argc++] = descr_file; + phargs[argc++] = (char*) descr_file; } for (i=0; i> 8) & 0377) != 0) - { - cleanup(); - sys_stop(S_EXIT); + fprint(STDERR, "%s ", phargs[i]); + i++; } + fprint(STDERR, "\n"); + } + + status = sys_system(phargs[0], (const char* const*) phargs); + if ((status & 0177) != 0) + { + fatal("%s got a unix signal", phargs[0]); + } + if (((status >> 8) & 0377) != 0) + { + cleanup(); + sys_stop(S_EXIT); } } @@ -333,10 +320,6 @@ int main(int argc, char* argv[]) int opt; int i; - if (signal(SIGHUP, catch) == SIG_IGN) - (void)signal(SIGHUP, SIG_IGN); - if (signal(SIGQUIT, catch) == SIG_IGN) - (void)signal(SIGQUIT, SIG_IGN); if (signal(SIGINT, catch) == SIG_IGN) (void)signal(SIGINT, SIG_IGN); prog_name = argv[0]; @@ -406,14 +389,7 @@ int main(int argc, char* argv[]) fatal("no correct -P flag given"); } - { - char* tmpdir = getenv("TMPDIR"); - if (!tmpdir) - tmpdir = "/tmp"; - strcpy(tmpbase, tmpdir); - strcat(tmpbase, "/ego.XXXXXX"); - close(mkstemp(tmpbase)); - } + tmpbase = sys_maketempfile("ego", ""); strcpy(ddump, tmpbase); strcpy(pdump, tmpbase); diff --git a/util/ego/ic/ic.c b/util/ego/ic/ic.c index a0203aefb..af0907bac 100644 --- a/util/ego/ic/ic.c +++ b/util/ego/ic/ic.c @@ -83,9 +83,9 @@ char* argv[]; const char* dname_out = argv[6]; const char* lname_out = argv[7]; - FILE* lfile = openfile(lname_out, "w"); - FILE* pdump = openfile(pdump_out, "w"); - FILE* ddump = openfile(ddump_out, "w"); + FILE* lfile = openfile(lname_out, "wb"); + FILE* pdump = openfile(pdump_out, "wb"); + FILE* ddump = openfile(ddump_out, "wb"); FILE* dfile; FILE* pfile; @@ -117,9 +117,9 @@ char* argv[]; cleanprocs(prochash, NPROCHASH, 0); cleandblocks(symhash, NSYMHASH, 0); /* Now write the datablock table and the proctable */ - dfile = openfile(dname_out, "w"); + dfile = openfile(dname_out, "wb"); putdtable(fdblock, dfile); - pfile = openfile(pname_out, "w"); + pfile = openfile(pname_out, "wb"); putptable(fproc, pfile, FALSE); exit(0); } diff --git a/util/ego/ic/ic_lib.c b/util/ego/ic/ic_lib.c index 3933493e8..b2bf800e1 100644 --- a/util/ego/ic/ic_lib.c +++ b/util/ego/ic/ic_lib.c @@ -298,7 +298,7 @@ char* argv[]; return NULL; } filename = argv[argcnt]; - if ((curfile = fopen(filename, "r")) == NULL) + if ((curfile = fopen(filename, "rb")) == NULL) { error("cannot open %s", filename); } diff --git a/util/ego/il/il.c b/util/ego/il/il.c index 690be2435..34ff56c2f 100644 --- a/util/ego/il/il.c +++ b/util/ego/il/il.c @@ -12,6 +12,7 @@ #include #include #include +#include "system.h" #include "../share/types.h" #include "il.h" #include "../share/debug.h" @@ -37,12 +38,12 @@ calcnt_p cchead; /* call-count info of current proc */ STATIC long space = 0; STATIC long total_size = 0; -STATIC char cname[NAME_MAX]; -STATIC char ccname[NAME_MAX]; -STATIC char cname2[NAME_MAX]; +STATIC char* cname; +STATIC char* ccname; +STATIC char* cname2; /* For debugging only */ -STATIC char sname[NAME_MAX]; +STATIC char* sname; STATIC int kp_temps = 0; int Ssubst; @@ -71,10 +72,10 @@ STATIC void pass1(const char *lnam, const char *bnam, const char *cnam) short kind; line_p l; - f = openfile(lnam, "r"); - gf = openfile(bnam, "r"); - cf = openfile(cnam, "w"); - ccf = openfile(ccname, "w"); + f = openfile(lnam, "rb"); + gf = openfile(bnam, "rb"); + cf = openfile(cnam, "wb"); + ccf = openfile(ccname, "wb"); mesregs = Lempty_set(); apriori(fproc); /* use information from the procedure table to @@ -132,9 +133,9 @@ STATIC void pass2(const char *cnam, long space) FILE* cf, *cf2, *ccf; call_p c, a; - cf = openfile(cnam, "r"); - cf2 = openfile(cname2, "w"); - ccf = openfile(ccname, "r"); + cf = openfile(cnam, "rb"); + cf2 = openfile(cname2, "wb"); + ccf = openfile(ccname, "rb"); while ((c = getcall(cf)) != (call_p)0) { /* process all calls */ @@ -161,7 +162,7 @@ STATIC void pass2(const char *cnam, long space) fclose(ccf); if (!kp_temps) unlink(ccname); - cf2 = openfile(cname2, "r"); + cf2 = openfile(cname2, "rb"); add_actuals(fproc, cf2); cleancals(fproc); /* remove calls that were not selected */ /* add actual parameters to each selected call */ @@ -186,12 +187,12 @@ void pass3(const char *lnam, const char *lnam2) line_p l, startscan, cal; short lastcid; /* last call-id seen */ - lfile = openfile(lnam, "r"); - lfilerand = openfile(lnam, "r"); - lfile2 = openfile(lnam2, "w"); + lfile = openfile(lnam, "rb"); + lfilerand = openfile(lnam, "rb"); + lfile2 = openfile(lnam2, "wb"); if (verbose) { - sfile = openfile(sname, "w"); + sfile = openfile(sname, "wb"); } mesregs = Lempty_set(); while ((l = get_text(lfile, &curproc)) != (line_p)0) @@ -331,35 +332,24 @@ char* argv[]; { struct files* files = findfiles(argc, argv); FILE* f; - char* tmpdir = getenv("TMPDIR"); + char* tmpdir = sys_gettmpdir(); go(argc, argv, no_action, no_action, no_action, il_flags); il_extptab(fproc); /* add extended data structures */ - if (!tmpdir) - tmpdir = "/tmp"; - strcpy(cname, tmpdir); - strcpy(ccname, tmpdir); - strcpy(sname, tmpdir); - strcpy(cname2, tmpdir); + cname = sys_maketempfile("il", "i1"); + ccname = sys_maketempfile("il", "i2"); + sname = sys_maketempfile("il", "i3"); + cname2 = sys_maketempfile("il", "i4"); - strcat(cname, "/ego.i1.XXXXXX"); - strcat(ccname, "/ego.i2.XXXXXX"); - strcat(sname, "/ego.i3.XXXXXX"); - strcat(cname2, "/ego.i4.XXXXXX"); - - close(mkstemp(cname)); - close(mkstemp(ccname)); - close(mkstemp(sname)); - close(mkstemp(cname2)); pass1(files->lname_in, files->bname_in, cname); /* grep calls, analyse procedures */ space = total_size * space / 100; pass2(cname, space); /* select calls to be expanded */ pass3(files->lname_in, files->lname_out); /* do substitutions */ - f = openfile(files->dname_out, "w"); + f = openfile(files->dname_out, "wb"); il_cleanptab(fproc); /* remove extended data structures */ putdtable(fdblock, f); - f = openfile(files->pname_out, "w"); + f = openfile(files->pname_out, "wb"); putptable(fproc, f, FALSE); report("inline substitutions", Ssubst); #ifdef VERBOSE diff --git a/util/ego/ra/build.lua b/util/ego/ra/build.lua index cae0cfdb2..21a149110 100644 --- a/util/ego/ra/build.lua +++ b/util/ego/ra/build.lua @@ -18,13 +18,31 @@ normalrule { cprogram { name = "ra", - srcs = { "./ra*.c" }, + srcs = { + "./ra_allocl.c", + "./ra_aux.c", + "./ra.c", + "./ra_interv.c", + "./ra_items.c", + "./ra_lifet.c", + "./ra_pack.c", + "./ra_profits.c", + "./ra_xform.c", + }, deps = { "util/ego/share+lib", "modules/src/em_data+lib", "h+emheaders", "+itemtab_h", - "./ra*.h", + "./ra_allocl.h", + "./ra_aux.h", + "./ra.h", + "./ra_interv.h", + "./ra_items.h", + "./ra_lifet.h", + "./ra_pack.h", + "./ra_profits.h", + "./ra_xform.h", }, vars = { ["+cflags"] = {"-DVERBOSE", "-DNOTCOMPACT"} diff --git a/util/ego/ra/makeitems.c b/util/ego/ra/makeitems.c index f8bc64989..8be973b99 100644 --- a/util/ego/ra/makeitems.c +++ b/util/ego/ra/makeitems.c @@ -69,10 +69,10 @@ int main(int argc, char *argv[]) if (argc != 3) { error("usage: makeitems mnemfile itemfile"); } - if ((f1 = fopen(argv[1],"r")) == NULL) { + if ((f1 = fopen(argv[1],"rb")) == NULL) { error("cannot open mnemonic file"); } - if ((f2 = fopen(argv[2],"r")) == NULL) { + if ((f2 = fopen(argv[2],"rb")) == NULL) { error("cannot open item file"); } convert(f1,f2); diff --git a/util/ego/share/build.lua b/util/ego/share/build.lua index 7e152364a..bc3fda27f 100644 --- a/util/ego/share/build.lua +++ b/util/ego/share/build.lua @@ -48,7 +48,23 @@ clibrary { "./init_glob.c", }, deps = { - "./*.h", + "./alloc.h", + "./cset.h", + "./debug.h", + "./def.h", + "./files.h", + "./get.h", + "./global.h", + "./go.h", + "./init_glob.h", + "./locals.h", + "./lset.h", + "./map.h", + "./parser.h", + "./put.h", + "./stack_chg.h", + "./types.h", + "./utils.h", "+classdefs_h", "+pop_push_h", "h+emheaders", diff --git a/util/ego/share/get.c b/util/ego/share/get.c index 84a805828..16a88286e 100644 --- a/util/ego/share/get.c +++ b/util/ego/share/get.c @@ -167,7 +167,7 @@ proc_p getptable(const char *pname) proc_p head, p, *pp; short all; - if ((curinp = fopen(pname,"r")) == NULL) { + if ((curinp = fopen(pname,"rb")) == NULL) { error("cannot open %s",pname); } @@ -234,7 +234,7 @@ dblock_p getdtable(const char *dname) int n; head = (dblock_p) 0; - if ((curinp = fopen(dname,"r")) == NULL) { + if ((curinp = fopen(dname,"rb")) == NULL) { error("cannot open %s", dname); } olength = getshort(); diff --git a/util/ego/share/go.c b/util/ego/share/go.c index 0ccd3c6e9..477d54dea 100644 --- a/util/ego/share/go.c +++ b/util/ego/share/go.c @@ -33,7 +33,7 @@ STATIC void mach_init(char* machfile, void (*phase_machinit)(void *)) FILE* f; - f = openfile(machfile, "r"); + f = openfile(machfile, "rb"); fscanf(f, "%d", &ws); fscanf(f, "%d", &ps); if (ws != ps && ps != 2 * ws) @@ -104,10 +104,10 @@ void go(int argc, char * const *argv, (*initialize)(NULL); if (optimize == no_action) return; - f = openfile(files->lname_in, "r"); - gf = openfile(files->bname_in, "r"); - f2 = openfile(files->lname_out, "w"); - gf2 = openfile(files->bname_out, "w"); + f = openfile(files->lname_in, "rb"); + gf = openfile(files->bname_in, "rb"); + f2 = openfile(files->lname_out, "wb"); + gf2 = openfile(files->bname_out, "wb"); mesregs = Lempty_set(); while (getunit(gf, f, &kind, &g, &l, &curproc, TRUE)) { @@ -135,10 +135,10 @@ void go(int argc, char * const *argv, fclose(f2); fclose(gf); fclose(gf2); - f = openfile(files->dname_out, "w"); + f = openfile(files->dname_out, "wb"); putdtable(fdblock, f); /* fclose(f); done by putdtable */ - f = openfile(files->pname_out, "w"); + f = openfile(files->pname_out, "wb"); putptable(fproc, f, TRUE); /* fclose(f); done by putptable */ core_usage(); diff --git a/util/ego/share/makecldef.c b/util/ego/share/makecldef.c index ac831ed3b..5358809c4 100644 --- a/util/ego/share/makecldef.c +++ b/util/ego/share/makecldef.c @@ -75,10 +75,10 @@ int main(int argc, char *argv[]) if (argc != 3) { error("usage: makeclassdef mnemfile classfile"); } - if ((f1 = fopen(argv[1],"r")) == NULL) { + if ((f1 = fopen(argv[1],"rb")) == NULL) { error("cannot open mnemonic file"); } - if ((f2 = fopen(argv[2],"r")) == NULL) { + if ((f2 = fopen(argv[2],"rb")) == NULL) { error("cannot open class file"); } convert(f1,f2); diff --git a/util/ego/share/show.c b/util/ego/share/show.c index 7741f0cbf..f709a62b7 100644 --- a/util/ego/share/show.c +++ b/util/ego/share/show.c @@ -93,7 +93,7 @@ main(argc, argv) if (argc != 3 || argv[1][0] != '-') { error("usage: %s -[ldpbc] filename",argv[0]); } - if ((f = fopen(argv[2], "r")) == NULL) { + if ((f = fopen(argv[2], "rb")) == NULL) { error("cannot open %s", argv[2]); } switch(argv[1][1]) { diff --git a/util/flex/COPYING b/util/flex/COPYING deleted file mode 100644 index 9b01361ca..000000000 --- a/util/flex/COPYING +++ /dev/null @@ -1,38 +0,0 @@ -Flex carries the copyright used for BSD software, slightly modified -because it originated at the Lawrence Berkeley (not Livermore!) Laboratory, -which operates under a contract with the Department of Energy: - - Copyright (c) 1990 The Regents of the University of California. - All rights reserved. - - This code is derived from software contributed to Berkeley by - Vern Paxson. - - The United States Government has rights in this work pursuant - to contract no. DE-AC03-76SF00098 between the United States - Department of Energy and the University of California. - - Redistribution and use in source and binary forms are permitted - provided that: (1) source distributions retain this entire - copyright notice and comment, and (2) distributions including - binaries display the following acknowledgement: ``This product - includes software developed by the University of California, - Berkeley and its contributors'' in the documentation or other - materials provided with the distribution and in all advertising - materials mentioning features or use of this software. Neither the - name of the University nor the names of its contributors may be - used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. - -This basically says "do whatever you please with this software except -remove this notice or take advantage of the University's (or the flex -authors') name". - -Note that the "flex.skel" scanner skeleton carries no copyright notice. -You are free to do whatever you please with scanners generated using flex; -for them, you are not even bound by the above copyright. diff --git a/util/flex/Changes b/util/flex/Changes deleted file mode 100644 index 0111a1f21..000000000 --- a/util/flex/Changes +++ /dev/null @@ -1,345 +0,0 @@ -Changes between 2.3 Patch #7 (28Mar91) and 2.3 Patch #6: - - - Fixed out-of-bounds array access that caused bad tables - to be produced on machines where the bad reference happened - to yield a 1. This caused problems installing or running - flex on some Suns, in particular. - - -Changes between 2.3 Patch #6 (29Aug90) and 2.3 Patch #5: - - - Fixed a serious bug in yymore() which basically made it - completely broken. Thanks goes to Jean Christophe of - the Nethack development team for finding the problem - and passing along the fix. - - -Changes between 2.3 Patch #5 (16Aug90) and 2.3 Patch #4: - - - An up-to-date version of initscan.c so "make test" will - work after applying the previous patches - - -Changes between 2.3 Patch #4 (14Aug90) and 2.3 Patch #3: - - - Fixed bug in hexadecimal escapes which allowed only digits, - not letters, in escapes - - Fixed bug in previous "Changes" file! - - -Changes between 2.3 Patch #3 (03Aug90) and 2.3 Patch #2: - - - Correction to patch #2 for gcc compilation; thanks goes to - Paul Eggert for catching this. - - -Changes between 2.3 Patch #2 (02Aug90) and original 2.3 release: - - - Fixed (hopefully) headaches involving declaring malloc() - and free() for gcc, which defines __STDC__ but (often) doesn't - come with the standard include files such as . - Reordered #ifdef maze in the scanner skeleton in the hope of - getting the declarations right for cfront and g++, too. - - - Note that this patch supercedes patch #1 for release 2.3, - which was never announced but was available briefly for - anonymous ftp. - - -Changes between 2.3 (full) release of 28Jun90 and 2.2 (alpha) release: - - User-visible: - - - A lone <> rule (that is, one which is not qualified with - a list of start conditions) now specifies the EOF action for - *all* start conditions which haven't already had <> actions - given. To specify an end-of-file action for just the initial - state, use <>. - - - -d debug output is now contigent on the global yy_flex_debug - being set to a non-zero value, which it is by default. - - - A new macro, YY_USER_INIT, is provided for the user to specify - initialization action to be taken on the first call to the - scanner. This action is done before the scanner does its - own initialization. - - - yy_new_buffer() has been added as an alias for yy_create_buffer() - - - Comments beginning with '#' and extending to the end of the line - now work, but have been deprecated (in anticipation of making - flex recognize #line directives). - - - The funky restrictions on when semi-colons could follow the - YY_NEW_FILE and yyless macros have been removed. They now - behave identically to functions. - - - A bug in the sample redefinition of YY_INPUT in the documentation - has been corrected. - - - A bug in the sample simple tokener in the documentation has - been corrected. - - - The documentation on the incompatibilities between flex and - lex has been reordered so that the discussion of yylineno - and input() come first, as it's anticipated that these will - be the most common source of headaches. - - - Things which didn't used to be documented but now are: - - - flex interprets "^foo|bar" differently from lex. flex interprets - it as "match either a 'foo' or a 'bar', providing it comes at the - beginning of a line", whereas lex interprets it as "match either - a 'foo' at the beginning of a line, or a 'bar' anywhere". - - - flex initializes the global "yyin" on the first call to the - scanner, while lex initializes it at compile-time. - - - yy_switch_to_buffer() can be used in the yywrap() macro/routine. - - - flex scanners do not use stdio for their input, and hence when - writing an interactive scanner one must explictly call fflush() - after writing out a prompt. - - - flex scanner can be made reentrant (after a fashion) by using - "yyrestart( yyin );". This is useful for interactive scanners - which have interrupt handlers that long-jump out of the scanner. - - - a defense of why yylineno is not supported is included, along - with a suggestion on how to convert scanners which rely on it. - - - Other changes: - - - Prototypes and proper declarations of void routines have - been added to the flex source code, courtesy of Kevin B. Kenny. - - - Routines dealing with memory allocation now use void* pointers - instead of char* - see Makefile for porting implications. - - - Error-checking is now done when flex closes a file. - - - Various lint tweaks were added to reduce the number of gripes. - - - Makefile has been further parameterized to aid in porting. - - - Support for SCO Unix added. - - - Flex now sports the latest & greatest UC copyright notice - (which is only slightly different from the previous one). - - - A note has been added to flexdoc.1 mentioning work in progress - on modifying flex to generate straight C code rather than a - table-driven automaton, with an email address of whom to contact - if you are working along similar lines. - - -Changes between 2.2 Patch #3 (30Mar90) and 2.2 Patch #2: - - - fixed bug which caused -I scanners to bomb - - -Changes between 2.2 Patch #2 (27Mar90) and 2.2 Patch #1: - - - fixed bug writing past end of input buffer in yyunput() - - fixed bug detecting NUL's at the end of a buffer - - -Changes between 2.2 Patch #1 (23Mar90) and 2.2 (alpha) release: - - - Makefile fixes: definition of MAKE variable for systems - which don't have it; installation of flexdoc.1 along with - flex.1; fixed two bugs which could cause "bigtest" to fail. - - - flex.skel fix for compiling with g++. - - - README and flexdoc.1 no longer list an out-of-date BITNET address - for contacting me. - - - minor typos and formatting changes to flex.1 and flexdoc.1. - - -Changes between 2.2 (alpha) release of March '90 and previous release: - - User-visible: - - - Full user documentation now available. - - - Support for 8-bit scanners. - - - Scanners now accept NUL's. - - - A facility has been added for dealing with multiple - input buffers. - - - Two manual entries now. One which fully describes flex - (rather than just its differences from lex), and the - other for quick(er) reference. - - - A number of changes to bring flex closer into compliance - with the latest POSIX lex draft: - - %t support - flex now accepts multiple input files and concatenates - them together to form its input - previous -c (compress) flag renamed -C - do-nothing -c and -n flags added - Any indented code or code within %{}'s in section 2 is - now copied to the output - - - yyleng is now a bona fide global integer. - - - -d debug information now gives the line number of the - matched rule instead of which number rule it was from - the beginning of the file. - - - -v output now includes a summary of the flags used to generate - the scanner. - - - unput() and yyrestart() are now globally callable. - - - yyrestart() no longer closes the previous value of yyin. - - - C++ support; generated scanners can be compiled with C++ compiler. - - - Primitive -lfl library added, containing default main() - which calls yylex(). A number of routines currently living - in the scanner skeleton will probably migrate to here - in the future (in particular, yywrap() will probably cease - to be a macro and instead be a function in the -lfl library). - - - Hexadecimal (\x) escape sequences added. - - - Support for MS-DOS, VMS, and Turbo-C integrated. - - - The %used/%unused operators have been deprecated. They - may go away soon. - - - Other changes: - - - Makefile enhanced for easier testing and installation. - - The parser has been tweaked to detect some erroneous - constructions which previously were missed. - - Scanner input buffer overflow is now detected. - - Bugs with missing "const" declarations fixed. - - Out-of-date Minix/Atari patches provided. - - Scanners no longer require printf() unless FLEX_DEBUG is being used. - - A subtle input() bug has been fixed. - - Line numbers for "continued action" rules (those following - the special '|' action) are now correct. - - unput() bug fixed; had been causing problems porting flex to VMS. - - yymore() handling rewritten to fix bug with interaction - between yymore() and trailing context. - - EOF in actions now generates an error message. - - Bug involving -CFe and generating equivalence classes fixed. - - Bug which made -CF be treated as -Cf fixed. - - Support for SysV tmpnam() added. - - Unused #define's for scanner no longer generated. - - Error messages which are associated with a particular input - line are now all identified with their input line in standard - format. - - % directives which are valid to lex but not to flex are - now ignored instead of generating warnings. - - -DSYS_V flag can now also be specified -DUSG for System V - compilation. - - -Changes between 2.1 beta-test release of June '89 and previous release: - - User-visible: - - - -p flag generates a performance report to stderr. The report - consists of comments regarding features of the scanner rules - which result in slower scanners. - - - -b flag generates backtracking information to lex.backtrack. - This is a list of scanner states which require backtracking - and the characters on which they do so. By adding rules - one can remove backtracking states. If all backtracking states - are eliminated, the generated scanner will run faster. - Backtracking is not yet documented in the manual entry. - - - Variable trailing context now works, i.e., one can have - rules like "(foo)*/[ \t]*bletch". Some trailing context - patterns still cannot be properly matched and generate - error messages. These are patterns where the ending of the - first part of the rule matches the beginning of the second - part, such as "zx*/xy*", where the 'x*' matches the 'x' at - the beginning of the trailing context. Lex won't get these - patterns right either. - - - Faster scanners. - - - End-of-file rules. The special rule "<>" indicates - actions which are to be taken when an end-of-file is - encountered and yywrap() returns non-zero (i.e., indicates - no further files to process). See manual entry for example. - - - The -r (reject used) flag is gone. flex now scans the input - for occurrences of the string "REJECT" to determine if the - action is needed. It tries to be intelligent about this but - can be fooled. One can force the presence or absence of - REJECT by adding a line in the first section of the form - "%used REJECT" or "%unused REJECT". - - - yymore() has been implemented. Similarly to REJECT, flex - detects the use of yymore(), which can be overridden using - "%used" or "%unused". - - - Patterns like "x{0,3}" now work (i.e., with lower-limit == 0). - - - Removed '\^x' for ctrl-x misfeature. - - - Added '\a' and '\v' escape sequences. - - - \ now works for octal escape sequences; previously - \0 was required. - - - Better error reporting; line numbers are associated with rules. - - - yyleng is a macro; it cannot be accessed outside of the - scanner source file. - - - yytext and yyleng should not be modified within a flex action. - - - Generated scanners #define the name FLEX_SCANNER. - - - Rules are internally separated by YY_BREAK in lex.yy.c rather - than break, to allow redefinition. - - - The macro YY_USER_ACTION can be redefined to provide an action - which is always executed prior to the matched rule's action. - - - yyrestart() is a new action which can be used to restart - the scanner after it has seen an end-of-file (a "real" one, - that is, one for which yywrap() returned non-zero). It takes - a FILE* argument indicating a new file to scan and sets - things up so that a subsequent call to yylex() will start - scanning that file. - - - Internal scanner names all preceded by "yy_" - - - lex.yy.c is deleted if errors are encountered during processing. - - - Comments may be put in the first section of the input by preceding - them with '#'. - - - - Other changes: - - - Some portability-related bugs fixed, in particular for machines - with unsigned characters or sizeof( int* ) != sizeof( int ). - Also, tweaks for VMS and Microsoft C (MS-DOS), and identifiers all - trimmed to be 31 or fewer characters. Shortened file names - for dinosaur OS's. Checks for allocating > 64K memory - on 16 bit'ers. Amiga tweaks. Compiles using gcc on a Sun-3. - - Compressed and fast scanner skeletons merged. - - Skeleton header files done away with. - - Generated scanner uses prototypes and "const" for __STDC__. - - -DSV flag is now -DSYS_V for System V compilation. - - Removed all references to FTL language. - - Software now covered by BSD Copyright. - - flex will replace lex in subsequent BSD releases. diff --git a/util/flex/Headers b/util/flex/Headers deleted file mode 100644 index 35702da72..000000000 --- a/util/flex/Headers +++ /dev/null @@ -1,25 +0,0 @@ -This file contains the original RCS Headers. Unfortunately, RCS will destroy -them as soon as we bring our version under RCS. This file lives under RCS as -well, so all occurences of a $ followed by Header are changed into $header. - -Makefile:# @(#) $header: /usr/fsys/odin/a/vern/flex/RCS/Makefile,v 2.9 90/05/26 17:28:44 vern Exp $ (LBL) -README:// $header: /usr/fsys/odin/a/vern/flex/RCS/README,v 2.8 90/05/26 17:31:27 vern Exp $ -ccl.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/ccl.c,v 2.5 90/06/27 23:48:13 vern Exp $ (LBL)"; -dfa.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/dfa.c,v 2.7 90/06/27 23:48:15 vern Exp $ (LBL)"; -ecs.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/ecs.c,v 2.5 90/06/27 23:48:17 vern Exp $ (LBL)"; -flex.skel: * $header: /usr/fsys/odin/a/vern/flex/RCS/flex.skel,v 2.16 90/08/03 14:09:36 vern Exp $ -flexdef.h:/* @(#) $header: /usr/fsys/odin/a/vern/flex/RCS/flexdef.h,v 2.10 90/08/03 14:09:52 vern Exp $ (LBL) */ -gen.c: "@(#) $header: /home/horse/u0/vern/flex/RCS/gen.c,v 2.12 91/03/28 12:01:38 vern Exp $ (LBL)"; -initscan.c: * $header: /usr/fsys/odin/a/vern/flex/RCS/flex.skel,v 2.16 90/08/03 14:09:36 vern Exp $ -initscan.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)"; -libmain.c:/* $header: /usr/fsys/odin/a/vern/flex/RCS/libmain.c,v 1.2 90/05/26 16:50:08 vern Exp $ */ -main.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/main.c,v 2.9 90/06/27 23:48:24 vern Exp $ (LBL)"; -misc.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/misc.c,v 2.9 90/08/14 00:10:24 vern Exp $ (LBL)"; -nfa.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/nfa.c,v 2.6 90/06/27 23:48:29 vern Exp $ (LBL)"; -parse.y: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/parse.y,v 2.7 90/06/27 23:48:31 vern Exp $ (LBL)"; -scan.c: * $header: /usr/fsys/odin/a/vern/flex/RCS/flex.skel,v 2.16 90/08/03 14:09:36 vern Exp $ -scan.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)"; -scan.l: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)"; -sym.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/sym.c,v 2.4 90/06/27 23:48:36 vern Exp $ (LBL)"; -tblcmp.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/tblcmp.c,v 2.5 90/06/27 23:48:38 vern Exp $ (LBL)"; -yylex.c: "@(#) $header: /usr/fsys/odin/a/vern/flex/RCS/yylex.c,v 2.5 90/06/27 23:48:40 vern Exp $ (LBL)"; diff --git a/util/flex/Makefile b/util/flex/Makefile deleted file mode 100644 index f73e6bbaf..000000000 --- a/util/flex/Makefile +++ /dev/null @@ -1,190 +0,0 @@ -# make file for "flex" tool - -# @(#) $Id$ (LBL) - -# Porting considerations: -# -# For System V Unix machines, add -DUSG to CFLAGS (if it's not -# automatically defined) -# For Vax/VMS, add "-DVMS -DUSG" to CFLAGS. -# For MS-DOS, add "-DMS_DOS -DUSG" to CFLAGS. Create \tmp if not present. -# You will also want to rename flex.skel to something with a three -# character extension, change SKELETON_FILE below appropriately, -# See MSDOS.notes for more info. -# For Amiga, add "-DAMIGA -DUSG" to CFLAGS. -# For SCO Unix, add "-DSCO_UNIX" to CFLAGS. -# -# For C compilers which don't know about "void", add -Dvoid=int to CFLAGS. -# -# If your C compiler is ANSI standard but does not include the -# header file (some installations of gcc have this problem), then add -# -DDONT_HAVE_STDLIB_H to CFLAGS. -# -# By default, flex will be configured to generate 8-bit scanners only -# if the -8 flag is given. If you want it to always generate 8-bit -# scanners, add "-DDEFAULT_CSIZE=256" to CFLAGS. Note that doing -# so will double the size of all uncompressed scanners. -# -# If on your system you have trouble building flex due to 8-bit -# character problems, remove the -8 from FLEX_FLAGS and the -# "#define FLEX_8_BIT_CHARS" from the beginning of flexdef.h. - - -# the first time around use "make first_flex" - - -# Installation targeting. Files will be installed under the tree rooted -# at DESTDIR. User commands will be installed in BINDIR, library files -# in LIBDIR (which will be created if necessary), auxiliary files in -# AUXDIR, manual pages will be installed in MANDIR with extension MANEXT. -# Raw, unformatted troff source will be installed if INSTALLMAN=man, nroff -# preformatted versions will be installed if INSTALLMAN=cat. -DESTDIR = -BINDIR = /usr/local -LIBDIR = /usr/local/lib -AUXDIR = /usr/local/lib -MANDIR = /usr/man/manl -MANEXT = l -INSTALLMAN = man - -# MAKE = make - - -SKELETON_FILE = $(DESTDIR)$(AUXDIR)/flex.skel -SKELFLAGS = -DDEFAULT_SKELETON_FILE=\"$(SKELETON_FILE)\" -CFLAGS = -O -LDFLAGS = -s - -COMPRESSION = -FLEX_FLAGS = -ist8 -Sflex.skel -# which "flex" to use to generate scan.c from scan.l -FLEX = ./flex -# CC = cc - -AR = ar -RANLIB = ranlib - -FLEXOBJS = \ - ccl.o \ - dfa.o \ - ecs.o \ - gen.o \ - main.o \ - misc.o \ - nfa.o \ - parse.o \ - scan.o \ - sym.o \ - tblcmp.o \ - yylex.o - -FLEX_C_SOURCES = \ - ccl.c \ - dfa.c \ - ecs.c \ - gen.c \ - main.c \ - misc.c \ - nfa.c \ - parse.c \ - scan.c \ - sym.c \ - tblcmp.c \ - yylex.c - -FLEX_LIB_OBJS = \ - libmain.o - -FLEXLIB = flexlib.a - - -all : flex $(FLEXLIB) - -flex : $(FLEXOBJS) - $(CC) $(CFLAGS) -o flex $(LDFLAGS) $(FLEXOBJS) - -first_flex: - cp initscan.c scan.c - $(MAKE) $(MFLAGS) flex - -parse.h parse.c : parse.y - $(YACC) -d parse.y - @mv y.tab.c parse.c - @mv y.tab.h parse.h - -scan.c : scan.l - $(FLEX) $(FLEX_FLAGS) $(COMPRESSION) scan.l >scan.c - -scan.o : scan.c parse.h flexdef.h - -main.o : main.c flexdef.h - $(CC) $(CFLAGS) -c $(SKELFLAGS) main.c - -ccl.o : ccl.c flexdef.h -dfa.o : dfa.c flexdef.h -ecs.o : ecs.c flexdef.h -gen.o : gen.c flexdef.h -misc.o : misc.c flexdef.h -nfa.o : nfa.c flexdef.h -parse.o : parse.c flexdef.h -sym.o : sym.c flexdef.h -tblcmp.o : tblcmp.c flexdef.h -yylex.o : yylex.c flexdef.h - -flex.man : flex.1 - nroff -man flex.1 >flex.man - -$(FLEXLIB) : $(FLEX_LIB_OBJS) - $(AR) cru $(FLEXLIB) $(FLEX_LIB_OBJS) - -lint : $(FLEX_C_SOURCES) - lint $(FLEX_C_SOURCES) > flex.lint - -distrib : - mv scan.c initscan.c - chmod 444 initscan.c - $(MAKE) $(MFLAGS) clean - -install: flex $(DESTDIR)$(LIBDIR) flex.skel install.$(INSTALLMAN) install-lib - install -s -m 755 flex $(DESTDIR)$(BINDIR)/flex - install -c -m 644 flex.skel $(SKELETON_FILE) - -install-lib: $(DESTDIR)$(LIBDIR) $(FLEXLIB) - install -c -m 644 $(FLEXLIB) $(DESTDIR)$(LIBDIR)/libfl.a - $(RANLIB) $(DESTDIR)$(LIBDIR)/libfl.a - -$(DESTDIR)$(LIBDIR): - mkdir $@ - -install.man: flex.1 flexdoc.1 - install -c -m 644 flex.1 $(DESTDIR)$(MANDIR)/flex.$(MANEXT) - install -c -m 644 flexdoc.1 $(DESTDIR)$(MANDIR)/flexdoc.$(MANEXT) - -install.cat: flex.1 flexdoc.1 - nroff -h -man flex.1 > $(DESTDIR)$(MANDIR)/flex.$(MANEXT) - nroff -h -man flexdoc.1 > $(DESTDIR)$(MANDIR)/flexdoc.$(MANEXT) - chmod 644 $(DESTDIR)$(MANDIR)/flex.$(MANEXT) - chmod 644 $(DESTDIR)$(MANDIR)/flexdoc.$(MANEXT) - -clean : - rm -f core errs flex *.o parse.c *.lint parse.h flex.man tags \ - $(FLEXLIB) - -tags : - ctags $(FLEX_C_SOURCES) - -vms : flex.man - $(MAKE) $(MFLAGS) distrib - -test : flex - ./flex $(FLEX_FLAGS) $(COMPRESSION) scan.l | diff scan.c - - -bigtest : - rm -f scan.c ; $(MAKE) COMPRESSION="-C" test - rm -f scan.c ; $(MAKE) COMPRESSION="-Ce" test - rm -f scan.c ; $(MAKE) COMPRESSION="-Cm" test - rm -f scan.c ; $(MAKE) COMPRESSION="-Cfe" test - rm -f scan.c ; $(MAKE) COMPRESSION="-CFe" test - rm -f scan.c ; $(MAKE) COMPRESSION="-Cf" test - rm -f scan.c ; $(MAKE) COMPRESSION="-CF" test - rm -f scan.c ; $(MAKE) diff --git a/util/flex/README b/util/flex/README deleted file mode 100644 index 7faa7e0dd..000000000 --- a/util/flex/README +++ /dev/null @@ -1,78 +0,0 @@ -// $Id$ - -This is release 2.3 of flex - a full release. - -The flex distribution consists of the following files: - - README This message - - Makefile - flexdef.h - parse.y - scan.l - ccl.c - dfa.c - ecs.c flex sources - gen.c - main.c - misc.c - nfa.c - sym.c - tblcmp.c - yylex.c - - libmain.c flex library (-lfl) source - - initscan.c pre-flex'd version of scan.l - - flex.skel skeleton for generated scanners - - flexdoc.1 full user documentation - flex.1 reference documentation - - Changes Differences between this release and the previous one - - COPYING flex's copyright - - MISC/ a directory containing miscellaneous porting-related - notes (for Atari, MS-DOS, Turbo-C, and VMS) - - -Decide where you want to keep flex.skel (suggestion: /usr/local/lib), -but don't move it there yet. Edit "Makefile" and change the definition -of SKELETON_FILE to reflect the full pathname of flex.skel. - -Read the "Porting considerations" note in the Makefile and make -the necessary changes. - -To make flex for the first time, use: - - make first_flex - -which uses the pre-generated copy of the flex scanner (the scanner -itself is written using flex). - -Assuming it builds successfully, you can test it using - - make test - -The "diff" should not show any differences. - -If you're feeling adventurous, issue "make bigtest" and be prepared -to wait a while. - -Install flex using: - - make install - - -Please send problems and feedback to: - - vern@cs.cornell.edu - decvax!cornell!vern - - Vern Paxson - CS Department - 4126 Upson Hall - Cornell University - Ithaca, NY 14853-7501 diff --git a/util/flex/ccl.c b/util/flex/ccl.c deleted file mode 100644 index f9e5016da..000000000 --- a/util/flex/ccl.c +++ /dev/null @@ -1,175 +0,0 @@ -/* ccl - routines for character classes */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#include "flexdef.h" - -/* ccladd - add a single character to a ccl - * - * synopsis - * int cclp; - * int ch; - * ccladd( cclp, ch ); - */ - -void ccladd( cclp, ch ) -int cclp; -int ch; - - { - int ind, len, newpos, i; - - len = ccllen[cclp]; - ind = cclmap[cclp]; - - /* check to see if the character is already in the ccl */ - - for ( i = 0; i < len; ++i ) - if ( ccltbl[ind + i] == ch ) - return; - - newpos = ind + len; - - if ( newpos >= current_max_ccl_tbl_size ) - { - current_max_ccl_tbl_size += MAX_CCL_TBL_SIZE_INCREMENT; - - ++num_reallocs; - - ccltbl = reallocate_character_array( ccltbl, current_max_ccl_tbl_size ); - } - - ccllen[cclp] = len + 1; - ccltbl[newpos] = ch; - } - - -/* cclinit - make an empty ccl - * - * synopsis - * int cclinit(); - * new_ccl = cclinit(); - */ - -int cclinit() - - { - if ( ++lastccl >= current_maxccls ) - { - current_maxccls += MAX_CCLS_INCREMENT; - - ++num_reallocs; - - cclmap = reallocate_integer_array( cclmap, current_maxccls ); - ccllen = reallocate_integer_array( ccllen, current_maxccls ); - cclng = reallocate_integer_array( cclng, current_maxccls ); - } - - if ( lastccl == 1 ) - /* we're making the first ccl */ - cclmap[lastccl] = 0; - - else - /* the new pointer is just past the end of the last ccl. Since - * the cclmap points to the \first/ character of a ccl, adding the - * length of the ccl to the cclmap pointer will produce a cursor - * to the first free space - */ - cclmap[lastccl] = cclmap[lastccl - 1] + ccllen[lastccl - 1]; - - ccllen[lastccl] = 0; - cclng[lastccl] = 0; /* ccl's start out life un-negated */ - - return ( lastccl ); - } - - -/* cclnegate - negate a ccl - * - * synopsis - * int cclp; - * cclnegate( ccl ); - */ - -void cclnegate( cclp ) -int cclp; - - { - cclng[cclp] = 1; - } - - -/* list_character_set - list the members of a set of characters in CCL form - * - * synopsis - * int cset[CSIZE]; - * FILE *file; - * list_character_set( cset ); - * - * writes to the given file a character-class representation of those - * characters present in the given set. A character is present if it - * has a non-zero value in the set array. - */ - -void list_character_set( file, cset ) -FILE *file; -int cset[]; - - { - register int i; - char *readable_form(); - - putc( '[', file ); - - for ( i = 0; i < csize; ++i ) - { - if ( cset[i] ) - { - register int start_char = i; - - putc( ' ', file ); - - fputs( readable_form( i ), file ); - - while ( ++i < csize && cset[i] ) - ; - - if ( i - 1 > start_char ) - /* this was a run */ - fprintf( file, "-%s", readable_form( i - 1 ) ); - - putc( ' ', file ); - } - } - - putc( ']', file ); - } diff --git a/util/flex/dfa.c b/util/flex/dfa.c deleted file mode 100644 index 90be096f8..000000000 --- a/util/flex/dfa.c +++ /dev/null @@ -1,1075 +0,0 @@ -/* dfa - DFA construction routines */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#include "flexdef.h" - - -/* declare functions that have forward references */ - -void dump_associated_rules PROTO((FILE*, int)); -void dump_transitions PROTO((FILE*, int[])); -void sympartition PROTO((int[], int, int[], int[])); -int symfollowset PROTO((int[], int, int, int[])); - - -/* check_for_backtracking - check a DFA state for backtracking - * - * synopsis - * int ds, state[numecs]; - * check_for_backtracking( ds, state ); - * - * ds is the number of the state to check and state[] is its out-transitions, - * indexed by equivalence class, and state_rules[] is the set of rules - * associated with this state - */ - -void check_for_backtracking( ds, state ) -int ds; -int state[]; - - { - if ( (reject && ! dfaacc[ds].dfaacc_set) || ! dfaacc[ds].dfaacc_state ) - { /* state is non-accepting */ - ++num_backtracking; - - if ( backtrack_report ) - { - fprintf( backtrack_file, "State #%d is non-accepting -\n", ds ); - - /* identify the state */ - dump_associated_rules( backtrack_file, ds ); - - /* now identify it further using the out- and jam-transitions */ - dump_transitions( backtrack_file, state ); - - putc( '\n', backtrack_file ); - } - } - } - - -/* check_trailing_context - check to see if NFA state set constitutes - * "dangerous" trailing context - * - * synopsis - * int nfa_states[num_states+1], num_states; - * int accset[nacc+1], nacc; - * check_trailing_context( nfa_states, num_states, accset, nacc ); - * - * NOTES - * Trailing context is "dangerous" if both the head and the trailing - * part are of variable size \and/ there's a DFA state which contains - * both an accepting state for the head part of the rule and NFA states - * which occur after the beginning of the trailing context. - * When such a rule is matched, it's impossible to tell if having been - * in the DFA state indicates the beginning of the trailing context - * or further-along scanning of the pattern. In these cases, a warning - * message is issued. - * - * nfa_states[1 .. num_states] is the list of NFA states in the DFA. - * accset[1 .. nacc] is the list of accepting numbers for the DFA state. - */ - -void check_trailing_context( nfa_states, num_states, accset, nacc ) -int *nfa_states, num_states; -int *accset; -register int nacc; - - { - register int i, j; - - for ( i = 1; i <= num_states; ++i ) - { - int ns = nfa_states[i]; - register int type = state_type[ns]; - register int ar = assoc_rule[ns]; - - if ( type == STATE_NORMAL || rule_type[ar] != RULE_VARIABLE ) - { /* do nothing */ - } - - else if ( type == STATE_TRAILING_CONTEXT ) - { - /* potential trouble. Scan set of accepting numbers for - * the one marking the end of the "head". We assume that - * this looping will be fairly cheap since it's rare that - * an accepting number set is large. - */ - for ( j = 1; j <= nacc; ++j ) - if ( accset[j] & YY_TRAILING_HEAD_MASK ) - { - fprintf( stderr, - "%s: Dangerous trailing context in rule at line %d\n", - program_name, rule_linenum[ar] ); - return; - } - } - } - } - - -/* dump_associated_rules - list the rules associated with a DFA state - * - * synopisis - * int ds; - * FILE *file; - * dump_associated_rules( file, ds ); - * - * goes through the set of NFA states associated with the DFA and - * extracts the first MAX_ASSOC_RULES unique rules, sorts them, - * and writes a report to the given file - */ - -void dump_associated_rules( file, ds ) -FILE *file; -int ds; - - { - register int i, j; - register int num_associated_rules = 0; - int rule_set[MAX_ASSOC_RULES + 1]; - int *dset = dss[ds]; - int size = dfasiz[ds]; - - for ( i = 1; i <= size; ++i ) - { - register rule_num = rule_linenum[assoc_rule[dset[i]]]; - - for ( j = 1; j <= num_associated_rules; ++j ) - if ( rule_num == rule_set[j] ) - break; - - if ( j > num_associated_rules ) - { /* new rule */ - if ( num_associated_rules < MAX_ASSOC_RULES ) - rule_set[++num_associated_rules] = rule_num; - } - } - - bubble( rule_set, num_associated_rules ); - - fprintf( file, " associated rule line numbers:" ); - - for ( i = 1; i <= num_associated_rules; ++i ) - { - if ( i % 8 == 1 ) - putc( '\n', file ); - - fprintf( file, "\t%d", rule_set[i] ); - } - - putc( '\n', file ); - } - - -/* dump_transitions - list the transitions associated with a DFA state - * - * synopisis - * int state[numecs]; - * FILE *file; - * dump_transitions( file, state ); - * - * goes through the set of out-transitions and lists them in human-readable - * form (i.e., not as equivalence classes); also lists jam transitions - * (i.e., all those which are not out-transitions, plus EOF). The dump - * is done to the given file. - */ - -void dump_transitions( file, state ) -FILE *file; -int state[]; - - { - register int i, ec; - int out_char_set[CSIZE]; - - for ( i = 0; i < csize; ++i ) - { - ec = abs( ecgroup[i] ); - out_char_set[i] = state[ec]; - } - - fprintf( file, " out-transitions: " ); - - list_character_set( file, out_char_set ); - - /* now invert the members of the set to get the jam transitions */ - for ( i = 0; i < csize; ++i ) - out_char_set[i] = ! out_char_set[i]; - - fprintf( file, "\n jam-transitions: EOF " ); - - list_character_set( file, out_char_set ); - - putc( '\n', file ); - } - - -/* epsclosure - construct the epsilon closure of a set of ndfa states - * - * synopsis - * int t[current_max_dfa_size], numstates, accset[num_rules + 1], nacc; - * int hashval; - * int *epsclosure(); - * t = epsclosure( t, &numstates, accset, &nacc, &hashval ); - * - * NOTES - * the epsilon closure is the set of all states reachable by an arbitrary - * number of epsilon transitions which themselves do not have epsilon - * transitions going out, unioned with the set of states which have non-null - * accepting numbers. t is an array of size numstates of nfa state numbers. - * Upon return, t holds the epsilon closure and numstates is updated. accset - * holds a list of the accepting numbers, and the size of accset is given - * by nacc. t may be subjected to reallocation if it is not large enough - * to hold the epsilon closure. - * - * hashval is the hash value for the dfa corresponding to the state set - */ - -int *epsclosure( t, ns_addr, accset, nacc_addr, hv_addr ) -int *t, *ns_addr, accset[], *nacc_addr, *hv_addr; - - { - register int stkpos, ns, tsp; - int numstates = *ns_addr, nacc, hashval, transsym, nfaccnum; - int stkend, nstate; - static int did_stk_init = false, *stk; - -#define MARK_STATE(state) \ - trans1[state] = trans1[state] - MARKER_DIFFERENCE; - -#define IS_MARKED(state) (trans1[state] < 0) - -#define UNMARK_STATE(state) \ - trans1[state] = trans1[state] + MARKER_DIFFERENCE; - -#define CHECK_ACCEPT(state) \ - { \ - nfaccnum = accptnum[state]; \ - if ( nfaccnum != NIL ) \ - accset[++nacc] = nfaccnum; \ - } - -#define DO_REALLOCATION \ - { \ - current_max_dfa_size += MAX_DFA_SIZE_INCREMENT; \ - ++num_reallocs; \ - t = reallocate_integer_array( t, current_max_dfa_size ); \ - stk = reallocate_integer_array( stk, current_max_dfa_size ); \ - } \ - -#define PUT_ON_STACK(state) \ - { \ - if ( ++stkend >= current_max_dfa_size ) \ - DO_REALLOCATION \ - stk[stkend] = state; \ - MARK_STATE(state) \ - } - -#define ADD_STATE(state) \ - { \ - if ( ++numstates >= current_max_dfa_size ) \ - DO_REALLOCATION \ - t[numstates] = state; \ - hashval = hashval + state; \ - } - -#define STACK_STATE(state) \ - { \ - PUT_ON_STACK(state) \ - CHECK_ACCEPT(state) \ - if ( nfaccnum != NIL || transchar[state] != SYM_EPSILON ) \ - ADD_STATE(state) \ - } - - if ( ! did_stk_init ) - { - stk = allocate_integer_array( current_max_dfa_size ); - did_stk_init = true; - } - - nacc = stkend = hashval = 0; - - for ( nstate = 1; nstate <= numstates; ++nstate ) - { - ns = t[nstate]; - - /* the state could be marked if we've already pushed it onto - * the stack - */ - if ( ! IS_MARKED(ns) ) - PUT_ON_STACK(ns) - - CHECK_ACCEPT(ns) - hashval = hashval + ns; - } - - for ( stkpos = 1; stkpos <= stkend; ++stkpos ) - { - ns = stk[stkpos]; - transsym = transchar[ns]; - - if ( transsym == SYM_EPSILON ) - { - tsp = trans1[ns] + MARKER_DIFFERENCE; - - if ( tsp != NO_TRANSITION ) - { - if ( ! IS_MARKED(tsp) ) - STACK_STATE(tsp) - - tsp = trans2[ns]; - - if ( tsp != NO_TRANSITION ) - if ( ! IS_MARKED(tsp) ) - STACK_STATE(tsp) - } - } - } - - /* clear out "visit" markers */ - - for ( stkpos = 1; stkpos <= stkend; ++stkpos ) - { - if ( IS_MARKED(stk[stkpos]) ) - { - UNMARK_STATE(stk[stkpos]) - } - else - flexfatal( "consistency check failed in epsclosure()" ); - } - - *ns_addr = numstates; - *hv_addr = hashval; - *nacc_addr = nacc; - - return ( t ); - } - - -/* increase_max_dfas - increase the maximum number of DFAs */ - -void increase_max_dfas() - - { - current_max_dfas += MAX_DFAS_INCREMENT; - - ++num_reallocs; - - base = reallocate_integer_array( base, current_max_dfas ); - def = reallocate_integer_array( def, current_max_dfas ); - dfasiz = reallocate_integer_array( dfasiz, current_max_dfas ); - accsiz = reallocate_integer_array( accsiz, current_max_dfas ); - dhash = reallocate_integer_array( dhash, current_max_dfas ); - dss = reallocate_int_ptr_array( dss, current_max_dfas ); - dfaacc = reallocate_dfaacc_union( dfaacc, current_max_dfas ); - - if ( nultrans ) - nultrans = reallocate_integer_array( nultrans, current_max_dfas ); - } - - -/* ntod - convert an ndfa to a dfa - * - * synopsis - * ntod(); - * - * creates the dfa corresponding to the ndfa we've constructed. the - * dfa starts out in state #1. - */ - -void ntod() - - { - int *accset, ds, nacc, newds; - int sym, hashval, numstates, dsize; - int num_full_table_rows; /* used only for -f */ - int *nset, *dset; - int targptr, totaltrans, i, comstate, comfreq, targ; - int *epsclosure(), snstods(), symlist[CSIZE + 1]; - int num_start_states; - int todo_head, todo_next; - - /* note that the following are indexed by *equivalence classes* - * and not by characters. Since equivalence classes are indexed - * beginning with 1, even if the scanner accepts NUL's, this - * means that (since every character is potentially in its own - * equivalence class) these arrays must have room for indices - * from 1 to CSIZE, so their size must be CSIZE + 1. - */ - int duplist[CSIZE + 1], state[CSIZE + 1]; - int targfreq[CSIZE + 1], targstate[CSIZE + 1]; - - /* this is so find_table_space(...) will know where to start looking in - * chk/nxt for unused records for space to put in the state - */ - if ( fullspd ) - firstfree = 0; - - accset = allocate_integer_array( num_rules + 1 ); - nset = allocate_integer_array( current_max_dfa_size ); - - /* the "todo" queue is represented by the head, which is the DFA - * state currently being processed, and the "next", which is the - * next DFA state number available (not in use). We depend on the - * fact that snstods() returns DFA's \in increasing order/, and thus - * need only know the bounds of the dfas to be processed. - */ - todo_head = todo_next = 0; - - for ( i = 0; i <= csize; ++i ) - { - duplist[i] = NIL; - symlist[i] = false; - } - - for ( i = 0; i <= num_rules; ++i ) - accset[i] = NIL; - - if ( trace ) - { - dumpnfa( scset[1] ); - fputs( "\n\nDFA Dump:\n\n", stderr ); - } - - inittbl(); - - /* check to see whether we should build a separate table for transitions - * on NUL characters. We don't do this for full-speed (-F) scanners, - * since for them we don't have a simple state number lying around with - * which to index the table. We also don't bother doing it for scanners - * unless (1) NUL is in its own equivalence class (indicated by a - * positive value of ecgroup[NUL]), (2) NUL's equilvalence class is - * the last equivalence class, and (3) the number of equivalence classes - * is the same as the number of characters. This latter case comes about - * when useecs is false or when its true but every character still - * manages to land in its own class (unlikely, but it's cheap to check - * for). If all these things are true then the character code needed - * to represent NUL's equivalence class for indexing the tables is - * going to take one more bit than the number of characters, and therefore - * we won't be assured of being able to fit it into a YY_CHAR variable. - * This rules out storing the transitions in a compressed table, since - * the code for interpreting them uses a YY_CHAR variable (perhaps it - * should just use an integer, though; this is worth pondering ... ###). - * - * Finally, for full tables, we want the number of entries in the - * table to be a power of two so the array references go fast (it - * will just take a shift to compute the major index). If encoding - * NUL's transitions in the table will spoil this, we give it its - * own table (note that this will be the case if we're not using - * equivalence classes). - */ - - /* note that the test for ecgroup[0] == numecs below accomplishes - * both (1) and (2) above - */ - if ( ! fullspd && ecgroup[0] == numecs ) - { /* NUL is alone in its equivalence class, which is the last one */ - int use_NUL_table = (numecs == csize); - - if ( fulltbl && ! use_NUL_table ) - { /* we still may want to use the table if numecs is a power of 2 */ - int power_of_two; - - for ( power_of_two = 1; power_of_two <= csize; power_of_two *= 2 ) - if ( numecs == power_of_two ) - { - use_NUL_table = true; - break; - } - } - - if ( use_NUL_table ) - nultrans = allocate_integer_array( current_max_dfas ); - /* from now on, nultrans != nil indicates that we're - * saving null transitions for later, separate encoding - */ - } - - - if ( fullspd ) - { - for ( i = 0; i <= numecs; ++i ) - state[i] = 0; - place_state( state, 0, 0 ); - } - - else if ( fulltbl ) - { - if ( nultrans ) - /* we won't be including NUL's transitions in the table, - * so build it for entries from 0 .. numecs - 1 - */ - num_full_table_rows = numecs; - - else - /* take into account the fact that we'll be including - * the NUL entries in the transition table. Build it - * from 0 .. numecs. - */ - num_full_table_rows = numecs + 1; - - /* declare it "short" because it's a real long-shot that that - * won't be large enough. - */ - printf( "static short int yy_nxt[][%d] =\n {\n", - /* '}' so vi doesn't get too confused */ - num_full_table_rows ); - - /* generate 0 entries for state #0 */ - for ( i = 0; i < num_full_table_rows; ++i ) - mk2data( 0 ); - - /* force ',' and dataflush() next call to mk2data */ - datapos = NUMDATAITEMS; - - /* force extra blank line next dataflush() */ - dataline = NUMDATALINES; - } - - /* create the first states */ - - num_start_states = lastsc * 2; - - for ( i = 1; i <= num_start_states; ++i ) - { - numstates = 1; - - /* for each start condition, make one state for the case when - * we're at the beginning of the line (the '%' operator) and - * one for the case when we're not - */ - if ( i % 2 == 1 ) - nset[numstates] = scset[(i / 2) + 1]; - else - nset[numstates] = mkbranch( scbol[i / 2], scset[i / 2] ); - - nset = epsclosure( nset, &numstates, accset, &nacc, &hashval ); - - if ( snstods( nset, numstates, accset, nacc, hashval, &ds ) ) - { - numas += nacc; - totnst += numstates; - ++todo_next; - - if ( variable_trailing_context_rules && nacc > 0 ) - check_trailing_context( nset, numstates, accset, nacc ); - } - } - - if ( ! fullspd ) - { - if ( ! snstods( nset, 0, accset, 0, 0, &end_of_buffer_state ) ) - flexfatal( "could not create unique end-of-buffer state" ); - - ++numas; - ++num_start_states; - ++todo_next; - } - - while ( todo_head < todo_next ) - { - targptr = 0; - totaltrans = 0; - - for ( i = 1; i <= numecs; ++i ) - state[i] = 0; - - ds = ++todo_head; - - dset = dss[ds]; - dsize = dfasiz[ds]; - - if ( trace ) - fprintf( stderr, "state # %d:\n", ds ); - - sympartition( dset, dsize, symlist, duplist ); - - for ( sym = 1; sym <= numecs; ++sym ) - { - if ( symlist[sym] ) - { - symlist[sym] = 0; - - if ( duplist[sym] == NIL ) - { /* symbol has unique out-transitions */ - numstates = symfollowset( dset, dsize, sym, nset ); - nset = epsclosure( nset, &numstates, accset, - &nacc, &hashval ); - - if ( snstods( nset, numstates, accset, - nacc, hashval, &newds ) ) - { - totnst = totnst + numstates; - ++todo_next; - numas += nacc; - - if ( variable_trailing_context_rules && nacc > 0 ) - check_trailing_context( nset, numstates, - accset, nacc ); - } - - state[sym] = newds; - - if ( trace ) - fprintf( stderr, "\t%d\t%d\n", sym, newds ); - - targfreq[++targptr] = 1; - targstate[targptr] = newds; - ++numuniq; - } - - else - { - /* sym's equivalence class has the same transitions - * as duplist(sym)'s equivalence class - */ - targ = state[duplist[sym]]; - state[sym] = targ; - - if ( trace ) - fprintf( stderr, "\t%d\t%d\n", sym, targ ); - - /* update frequency count for destination state */ - - i = 0; - while ( targstate[++i] != targ ) - ; - - ++targfreq[i]; - ++numdup; - } - - ++totaltrans; - duplist[sym] = NIL; - } - } - - numsnpairs = numsnpairs + totaltrans; - - if ( caseins && ! useecs ) - { - register int j; - - for ( i = 'A', j = 'a'; i <= 'Z'; ++i, ++j ) - state[i] = state[j]; - } - - if ( ds > num_start_states ) - check_for_backtracking( ds, state ); - - if ( nultrans ) - { - nultrans[ds] = state[NUL_ec]; - state[NUL_ec] = 0; /* remove transition */ - } - - if ( fulltbl ) - { - /* supply array's 0-element */ - if ( ds == end_of_buffer_state ) - mk2data( -end_of_buffer_state ); - else - mk2data( end_of_buffer_state ); - - for ( i = 1; i < num_full_table_rows; ++i ) - /* jams are marked by negative of state number */ - mk2data( state[i] ? state[i] : -ds ); - - /* force ',' and dataflush() next call to mk2data */ - datapos = NUMDATAITEMS; - - /* force extra blank line next dataflush() */ - dataline = NUMDATALINES; - } - - else if ( fullspd ) - place_state( state, ds, totaltrans ); - - else if ( ds == end_of_buffer_state ) - /* special case this state to make sure it does what it's - * supposed to, i.e., jam on end-of-buffer - */ - stack1( ds, 0, 0, JAMSTATE ); - - else /* normal, compressed state */ - { - /* determine which destination state is the most common, and - * how many transitions to it there are - */ - - comfreq = 0; - comstate = 0; - - for ( i = 1; i <= targptr; ++i ) - if ( targfreq[i] > comfreq ) - { - comfreq = targfreq[i]; - comstate = targstate[i]; - } - - bldtbl( state, ds, totaltrans, comstate, comfreq ); - } - } - - if ( fulltbl ) - dataend(); - - else if ( ! fullspd ) - { - cmptmps(); /* create compressed template entries */ - - /* create tables for all the states with only one out-transition */ - while ( onesp > 0 ) - { - mk1tbl( onestate[onesp], onesym[onesp], onenext[onesp], - onedef[onesp] ); - --onesp; - } - - mkdeftbl(); - } - } - - -/* snstods - converts a set of ndfa states into a dfa state - * - * synopsis - * int sns[numstates], numstates, newds, accset[num_rules + 1], nacc, hashval; - * int snstods(); - * is_new_state = snstods( sns, numstates, accset, nacc, hashval, &newds ); - * - * on return, the dfa state number is in newds. - */ - -int snstods( sns, numstates, accset, nacc, hashval, newds_addr ) -int sns[], numstates, accset[], nacc, hashval, *newds_addr; - - { - int didsort = 0; - register int i, j; - int newds, *oldsns; - - for ( i = 1; i <= lastdfa; ++i ) - if ( hashval == dhash[i] ) - { - if ( numstates == dfasiz[i] ) - { - oldsns = dss[i]; - - if ( ! didsort ) - { - /* we sort the states in sns so we can compare it to - * oldsns quickly. we use bubble because there probably - * aren't very many states - */ - bubble( sns, numstates ); - didsort = 1; - } - - for ( j = 1; j <= numstates; ++j ) - if ( sns[j] != oldsns[j] ) - break; - - if ( j > numstates ) - { - ++dfaeql; - *newds_addr = i; - return ( 0 ); - } - - ++hshcol; - } - - else - ++hshsave; - } - - /* make a new dfa */ - - if ( ++lastdfa >= current_max_dfas ) - increase_max_dfas(); - - newds = lastdfa; - - dss[newds] = (int *) malloc( (unsigned) ((numstates + 1) * sizeof( int )) ); - - if ( ! dss[newds] ) - flexfatal( "dynamic memory failure in snstods()" ); - - /* if we haven't already sorted the states in sns, we do so now, so that - * future comparisons with it can be made quickly - */ - - if ( ! didsort ) - bubble( sns, numstates ); - - for ( i = 1; i <= numstates; ++i ) - dss[newds][i] = sns[i]; - - dfasiz[newds] = numstates; - dhash[newds] = hashval; - - if ( nacc == 0 ) - { - if ( reject ) - dfaacc[newds].dfaacc_set = (int *) 0; - else - dfaacc[newds].dfaacc_state = 0; - - accsiz[newds] = 0; - } - - else if ( reject ) - { - /* we sort the accepting set in increasing order so the disambiguating - * rule that the first rule listed is considered match in the event of - * ties will work. We use a bubble sort since the list is probably - * quite small. - */ - - bubble( accset, nacc ); - - dfaacc[newds].dfaacc_set = - (int *) malloc( (unsigned) ((nacc + 1) * sizeof( int )) ); - - if ( ! dfaacc[newds].dfaacc_set ) - flexfatal( "dynamic memory failure in snstods()" ); - - /* save the accepting set for later */ - for ( i = 1; i <= nacc; ++i ) - dfaacc[newds].dfaacc_set[i] = accset[i]; - - accsiz[newds] = nacc; - } - - else - { /* find lowest numbered rule so the disambiguating rule will work */ - j = num_rules + 1; - - for ( i = 1; i <= nacc; ++i ) - if ( accset[i] < j ) - j = accset[i]; - - dfaacc[newds].dfaacc_state = j; - } - - *newds_addr = newds; - - return ( 1 ); - } - - -/* symfollowset - follow the symbol transitions one step - * - * synopsis - * int ds[current_max_dfa_size], dsize, transsym; - * int nset[current_max_dfa_size], numstates; - * numstates = symfollowset( ds, dsize, transsym, nset ); - */ - -int symfollowset( ds, dsize, transsym, nset ) -int ds[], dsize, transsym, nset[]; - - { - int ns, tsp, sym, i, j, lenccl, ch, numstates; - int ccllist; - - numstates = 0; - - for ( i = 1; i <= dsize; ++i ) - { /* for each nfa state ns in the state set of ds */ - ns = ds[i]; - sym = transchar[ns]; - tsp = trans1[ns]; - - if ( sym < 0 ) - { /* it's a character class */ - sym = -sym; - ccllist = cclmap[sym]; - lenccl = ccllen[sym]; - - if ( cclng[sym] ) - { - for ( j = 0; j < lenccl; ++j ) - { /* loop through negated character class */ - ch = ccltbl[ccllist + j]; - - if ( ch == 0 ) - ch = NUL_ec; - - if ( ch > transsym ) - break; /* transsym isn't in negated ccl */ - - else if ( ch == transsym ) - /* next 2 */ goto bottom; - } - - /* didn't find transsym in ccl */ - nset[++numstates] = tsp; - } - - else - for ( j = 0; j < lenccl; ++j ) - { - ch = ccltbl[ccllist + j]; - - if ( ch == 0 ) - ch = NUL_ec; - - if ( ch > transsym ) - break; - - else if ( ch == transsym ) - { - nset[++numstates] = tsp; - break; - } - } - } - - else if ( sym >= 'A' && sym <= 'Z' && caseins ) - flexfatal( "consistency check failed in symfollowset" ); - - else if ( sym == SYM_EPSILON ) - { /* do nothing */ - } - - else if ( abs( ecgroup[sym] ) == transsym ) - nset[++numstates] = tsp; - -bottom: - ; - } - - return ( numstates ); - } - - -/* sympartition - partition characters with same out-transitions - * - * synopsis - * integer ds[current_max_dfa_size], numstates, duplist[numecs]; - * symlist[numecs]; - * sympartition( ds, numstates, symlist, duplist ); - */ - -void sympartition( ds, numstates, symlist, duplist ) -int ds[], numstates, duplist[]; -int symlist[]; - - { - int tch, i, j, k, ns, dupfwd[CSIZE + 1], lenccl, cclp, ich; - - /* partitioning is done by creating equivalence classes for those - * characters which have out-transitions from the given state. Thus - * we are really creating equivalence classes of equivalence classes. - */ - - for ( i = 1; i <= numecs; ++i ) - { /* initialize equivalence class list */ - duplist[i] = i - 1; - dupfwd[i] = i + 1; - } - - duplist[1] = NIL; - dupfwd[numecs] = NIL; - - for ( i = 1; i <= numstates; ++i ) - { - ns = ds[i]; - tch = transchar[ns]; - - if ( tch != SYM_EPSILON ) - { - if ( tch < -lastccl || tch > csize ) - { - if ( tch > csize && tch <= CSIZE ) - flexerror( "scanner requires -8 flag" ); - - else - flexfatal( - "bad transition character detected in sympartition()" ); - } - - if ( tch >= 0 ) - { /* character transition */ - /* abs() needed for fake %t ec's */ - int ec = abs( ecgroup[tch] ); - - mkechar( ec, dupfwd, duplist ); - symlist[ec] = 1; - } - - else - { /* character class */ - tch = -tch; - - lenccl = ccllen[tch]; - cclp = cclmap[tch]; - mkeccl( ccltbl + cclp, lenccl, dupfwd, duplist, numecs, - NUL_ec ); - - if ( cclng[tch] ) - { - j = 0; - - for ( k = 0; k < lenccl; ++k ) - { - ich = ccltbl[cclp + k]; - - if ( ich == 0 ) - ich = NUL_ec; - - for ( ++j; j < ich; ++j ) - symlist[j] = 1; - } - - for ( ++j; j <= numecs; ++j ) - symlist[j] = 1; - } - - else - for ( k = 0; k < lenccl; ++k ) - { - ich = ccltbl[cclp + k]; - - if ( ich == 0 ) - ich = NUL_ec; - - symlist[ich] = 1; - } - } - } - } - } diff --git a/util/flex/ecs.c b/util/flex/ecs.c deleted file mode 100644 index 572435550..000000000 --- a/util/flex/ecs.c +++ /dev/null @@ -1,349 +0,0 @@ -/* ecs - equivalence class routines */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#include "flexdef.h" - -/* ccl2ecl - convert character classes to set of equivalence classes - * - * synopsis - * ccl2ecl(); - */ - -void ccl2ecl() - - { - int i, ich, newlen, cclp, ccls, cclmec; - - for ( i = 1; i <= lastccl; ++i ) - { - /* we loop through each character class, and for each character - * in the class, add the character's equivalence class to the - * new "character" class we are creating. Thus when we are all - * done, character classes will really consist of collections - * of equivalence classes - */ - - newlen = 0; - cclp = cclmap[i]; - - for ( ccls = 0; ccls < ccllen[i]; ++ccls ) - { - ich = ccltbl[cclp + ccls]; - cclmec = ecgroup[ich]; - - if ( xlation && cclmec < 0 ) - { - /* special hack--if we're doing %t tables then it's - * possible that no representative of this character's - * equivalence class is in the ccl. So waiting till - * we see the representative would be disastrous. Instead, - * we add this character's equivalence class anyway, if it's - * not already present. - */ - int j; - - /* this loop makes this whole process n^2; but we don't - * really care about %t performance anyway - */ - for ( j = 0; j < newlen; ++j ) - if ( ccltbl[cclp + j] == -cclmec ) - break; - - if ( j >= newlen ) - { /* no representative yet, add this one in */ - ccltbl[cclp + newlen] = -cclmec; - ++newlen; - } - } - - else if ( cclmec > 0 ) - { - ccltbl[cclp + newlen] = cclmec; - ++newlen; - } - } - - ccllen[i] = newlen; - } - } - - -/* cre8ecs - associate equivalence class numbers with class members - * - * synopsis - * int cre8ecs(); - * number of classes = cre8ecs( fwd, bck, num ); - * - * fwd is the forward linked-list of equivalence class members. bck - * is the backward linked-list, and num is the number of class members. - * - * Returned is the number of classes. - */ - -int cre8ecs( fwd, bck, num ) -int fwd[], bck[], num; - - { - int i, j, numcl; - - numcl = 0; - - /* create equivalence class numbers. From now on, abs( bck(x) ) - * is the equivalence class number for object x. If bck(x) - * is positive, then x is the representative of its equivalence - * class. - */ - for ( i = 1; i <= num; ++i ) - if ( bck[i] == NIL ) - { - bck[i] = ++numcl; - for ( j = fwd[i]; j != NIL; j = fwd[j] ) - bck[j] = -numcl; - } - - return ( numcl ); - } - - -/* ecs_from_xlation - associate equivalence class numbers using %t table - * - * synopsis - * numecs = ecs_from_xlation( ecmap ); - * - * Upon return, ecmap will map each character code to its equivalence - * class. The mapping will be positive if the character is the representative - * of its class, negative otherwise. - * - * Returns the number of equivalence classes used. - */ - -int ecs_from_xlation( ecmap ) -int ecmap[]; - - { - int i; - int nul_is_alone = false; - int did_default_xlation_class = false; - - if ( xlation[0] != 0 ) - { - /* if NUL shares its translation with other characters, choose one - * of the other characters as the representative for the equivalence - * class. This allows a cheap test later to see whether we can - * do away with NUL's equivalence class. - */ - for ( i = 1; i < csize; ++i ) - if ( xlation[i] == -xlation[0] ) - { - xlation[i] = xlation[0]; - ecmap[0] = -xlation[0]; - break; - } - - if ( i >= csize ) - /* didn't find a companion character--remember this fact */ - nul_is_alone = true; - } - - for ( i = 1; i < csize; ++i ) - if ( xlation[i] == 0 ) - { - if ( did_default_xlation_class ) - ecmap[i] = -num_xlations; - - else - { - /* make an equivalence class for those characters not - * specified in the %t table - */ - ++num_xlations; - ecmap[i] = num_xlations; - did_default_xlation_class = true; - } - } - - else - ecmap[i] = xlation[i]; - - if ( nul_is_alone ) - /* force NUL's equivalence class to be the last one */ - { - ++num_xlations; - ecmap[0] = num_xlations; - - /* there's actually a bug here: if someone is fanatic enough to - * put every character in its own translation class, then right - * now we just promoted NUL's equivalence class to be csize + 1; - * we can handle NUL's class number being == csize (by instead - * putting it in its own table), but we can't handle some *other* - * character having to be put in its own table, too. So in - * this case we bail out. - */ - if ( num_xlations > csize ) - flexfatal( "too many %t classes!" ); - } - - return num_xlations; - } - - -/* mkeccl - update equivalence classes based on character class xtions - * - * synopsis - * Char ccls[]; - * int lenccl, fwd[llsiz], bck[llsiz], llsiz, NUL_mapping; - * mkeccl( ccls, lenccl, fwd, bck, llsiz, NUL_mapping ); - * - * where ccls contains the elements of the character class, lenccl is the - * number of elements in the ccl, fwd is the forward link-list of equivalent - * characters, bck is the backward link-list, and llsiz size of the link-list - * - * NUL_mapping is the value which NUL (0) should be mapped to. - */ - -void mkeccl( ccls, lenccl, fwd, bck, llsiz, NUL_mapping ) -Char ccls[]; -int lenccl, fwd[], bck[], llsiz, NUL_mapping; - - { - int cclp, oldec, newec; - int cclm, i, j; - static unsigned char cclflags[CSIZE]; /* initialized to all '\0' */ - - /* note that it doesn't matter whether or not the character class is - * negated. The same results will be obtained in either case. - */ - - cclp = 0; - - while ( cclp < lenccl ) - { - cclm = ccls[cclp]; - - if ( NUL_mapping && cclm == 0 ) - cclm = NUL_mapping; - - oldec = bck[cclm]; - newec = cclm; - - j = cclp + 1; - - for ( i = fwd[cclm]; i != NIL && i <= llsiz; i = fwd[i] ) - { /* look for the symbol in the character class */ - for ( ; j < lenccl; ++j ) - { - register int ccl_char; - - if ( NUL_mapping && ccls[j] == 0 ) - ccl_char = NUL_mapping; - else - ccl_char = ccls[j]; - - if ( ccl_char > i ) - break; - - if ( ccl_char == i && ! cclflags[j] ) - { - /* we found an old companion of cclm in the ccl. - * link it into the new equivalence class and flag it as - * having been processed - */ - - bck[i] = newec; - fwd[newec] = i; - newec = i; - cclflags[j] = 1; /* set flag so we don't reprocess */ - - /* get next equivalence class member */ - /* continue 2 */ - goto next_pt; - } - } - - /* symbol isn't in character class. Put it in the old equivalence - * class - */ - - bck[i] = oldec; - - if ( oldec != NIL ) - fwd[oldec] = i; - - oldec = i; -next_pt: - ; - } - - if ( bck[cclm] != NIL || oldec != bck[cclm] ) - { - bck[cclm] = NIL; - fwd[oldec] = NIL; - } - - fwd[newec] = NIL; - - /* find next ccl member to process */ - - for ( ++cclp; cclflags[cclp] && cclp < lenccl; ++cclp ) - { - /* reset "doesn't need processing" flag */ - cclflags[cclp] = 0; - } - } - } - - -/* mkechar - create equivalence class for single character - * - * synopsis - * int tch, fwd[], bck[]; - * mkechar( tch, fwd, bck ); - */ - -void mkechar( tch, fwd, bck ) -int tch, fwd[], bck[]; - - { - /* if until now the character has been a proper subset of - * an equivalence class, break it away to create a new ec - */ - - if ( fwd[tch] != NIL ) - bck[fwd[tch]] = bck[tch]; - - if ( bck[tch] != NIL ) - fwd[bck[tch]] = fwd[tch]; - - fwd[tch] = NIL; - bck[tch] = NIL; - } diff --git a/util/flex/flex.1 b/util/flex/flex.1 deleted file mode 100644 index 3035f26d2..000000000 --- a/util/flex/flex.1 +++ /dev/null @@ -1,781 +0,0 @@ -.TH FLEX 1 "26 May 1990" "Version 2.3" -.SH NAME -flex - fast lexical analyzer generator -.SH SYNOPSIS -.B flex -.B [-bcdfinpstvFILT8 -C[efmF] -Sskeleton] -.I [filename ...] -.SH DESCRIPTION -.I flex -is a tool for generating -.I scanners: -programs which recognized lexical patterns in text. -.I flex -reads -the given input files, or its standard input if no file names are given, -for a description of a scanner to generate. The description is in -the form of pairs -of regular expressions and C code, called -.I rules. flex -generates as output a C source file, -.B lex.yy.c, -which defines a routine -.B yylex(). -This file is compiled and linked with the -.B -lfl -library to produce an executable. When the executable is run, -it analyzes its input for occurrences -of the regular expressions. Whenever it finds one, it executes -the corresponding C code. -.LP -For full documentation, see -.B flexdoc(1). -This manual entry is intended for use as a quick reference. -.SH OPTIONS -.I flex -has the following options: -.TP -.B -b -Generate backtracking information to -.I lex.backtrack. -This is a list of scanner states which require backtracking -and the input characters on which they do so. By adding rules one -can remove backtracking states. If all backtracking states -are eliminated and -.B -f -or -.B -F -is used, the generated scanner will run faster. -.TP -.B -c -is a do-nothing, deprecated option included for POSIX compliance. -.IP -.B NOTE: -in previous releases of -.I flex -.B -c -specified table-compression options. This functionality is -now given by the -.B -C -flag. To ease the the impact of this change, when -.I flex -encounters -.B -c, -it currently issues a warning message and assumes that -.B -C -was desired instead. In the future this "promotion" of -.B -c -to -.B -C -will go away in the name of full POSIX compliance (unless -the POSIX meaning is removed first). -.TP -.B -d -makes the generated scanner run in -.I debug -mode. Whenever a pattern is recognized and the global -.B yy_flex_debug -is non-zero (which is the default), the scanner will -write to -.I stderr -a line of the form: -.nf - - --accepting rule at line 53 ("the matched text") - -.fi -The line number refers to the location of the rule in the file -defining the scanner (i.e., the file that was fed to flex). Messages -are also generated when the scanner backtracks, accepts the -default rule, reaches the end of its input buffer (or encounters -a NUL; the two look the same as far as the scanner's concerned), -or reaches an end-of-file. -.TP -.B -f -specifies (take your pick) -.I full table -or -.I fast scanner. -No table compression is done. The result is large but fast. -This option is equivalent to -.B -Cf -(see below). -.TP -.B -i -instructs -.I flex -to generate a -.I case-insensitive -scanner. The case of letters given in the -.I flex -input patterns will -be ignored, and tokens in the input will be matched regardless of case. The -matched text given in -.I yytext -will have the preserved case (i.e., it will not be folded). -.TP -.B -n -is another do-nothing, deprecated option included only for -POSIX compliance. -.TP -.B -p -generates a performance report to stderr. The report -consists of comments regarding features of the -.I flex -input file which will cause a loss of performance in the resulting scanner. -.TP -.B -s -causes the -.I default rule -(that unmatched scanner input is echoed to -.I stdout) -to be suppressed. If the scanner encounters input that does not -match any of its rules, it aborts with an error. -.TP -.B -t -instructs -.I flex -to write the scanner it generates to standard output instead -of -.B lex.yy.c. -.TP -.B -v -specifies that -.I flex -should write to -.I stderr -a summary of statistics regarding the scanner it generates. -.TP -.B -F -specifies that the -.ul -fast -scanner table representation should be used. This representation is -about as fast as the full table representation -.ul -(-f), -and for some sets of patterns will be considerably smaller (and for -others, larger). See -.B flexdoc(1) -for details. -.IP -This option is equivalent to -.B -CF -(see below). -.TP -.B -I -instructs -.I flex -to generate an -.I interactive -scanner, that is, a scanner which stops immediately rather than -looking ahead if it knows -that the currently scanned text cannot be part of a longer rule's match. -Again, see -.B flexdoc(1) -for details. -.IP -Note, -.B -I -cannot be used in conjunction with -.I full -or -.I fast tables, -i.e., the -.B -f, -F, -Cf, -or -.B -CF -flags. -.TP -.B -L -instructs -.I flex -not to generate -.B #line -directives in -.B lex.yy.c. -The default is to generate such directives so error -messages in the actions will be correctly -located with respect to the original -.I flex -input file, and not to -the fairly meaningless line numbers of -.B lex.yy.c. -.TP -.B -T -makes -.I flex -run in -.I trace -mode. It will generate a lot of messages to -.I stdout -concerning -the form of the input and the resultant non-deterministic and deterministic -finite automata. This option is mostly for use in maintaining -.I flex. -.TP -.B -8 -instructs -.I flex -to generate an 8-bit scanner. -On some sites, this is the default. On others, the default -is 7-bit characters. To see which is the case, check the verbose -.B (-v) -output for "equivalence classes created". If the denominator of -the number shown is 128, then by default -.I flex -is generating 7-bit characters. If it is 256, then the default is -8-bit characters. -.TP -.B -C[efmF] -controls the degree of table compression. -.IP -.B -Ce -directs -.I flex -to construct -.I equivalence classes, -i.e., sets of characters -which have identical lexical properties. -Equivalence classes usually give -dramatic reductions in the final table/object file sizes (typically -a factor of 2-5) and are pretty cheap performance-wise (one array -look-up per character scanned). -.IP -.B -Cf -specifies that the -.I full -scanner tables should be generated - -.I flex -should not compress the -tables by taking advantages of similar transition functions for -different states. -.IP -.B -CF -specifies that the alternate fast scanner representation (described in -.B flexdoc(1)) -should be used. -.IP -.B -Cm -directs -.I flex -to construct -.I meta-equivalence classes, -which are sets of equivalence classes (or characters, if equivalence -classes are not being used) that are commonly used together. Meta-equivalence -classes are often a big win when using compressed tables, but they -have a moderate performance impact (one or two "if" tests and one -array look-up per character scanned). -.IP -A lone -.B -C -specifies that the scanner tables should be compressed but neither -equivalence classes nor meta-equivalence classes should be used. -.IP -The options -.B -Cf -or -.B -CF -and -.B -Cm -do not make sense together - there is no opportunity for meta-equivalence -classes if the table is not being compressed. Otherwise the options -may be freely mixed. -.IP -The default setting is -.B -Cem, -which specifies that -.I flex -should generate equivalence classes -and meta-equivalence classes. This setting provides the highest -degree of table compression. You can trade off -faster-executing scanners at the cost of larger tables with -the following generally being true: -.nf - - slowest & smallest - -Cem - -Cm - -Ce - -C - -C{f,F}e - -C{f,F} - fastest & largest - -.fi -.IP -.B -C -options are not cumulative; whenever the flag is encountered, the -previous -C settings are forgotten. -.TP -.B -Sskeleton_file -overrides the default skeleton file from which -.I flex -constructs its scanners. You'll never need this option unless you are doing -.I flex -maintenance or development. -.SH SUMMARY OF FLEX REGULAR EXPRESSIONS -The patterns in the input are written using an extended set of regular -expressions. These are: -.nf - - x match the character 'x' - . any character except newline - [xyz] a "character class"; in this case, the pattern - matches either an 'x', a 'y', or a 'z' - [abj-oZ] a "character class" with a range in it; matches - an 'a', a 'b', any letter from 'j' through 'o', - or a 'Z' - [^A-Z] a "negated character class", i.e., any character - but those in the class. In this case, any - character EXCEPT an uppercase letter. - [^A-Z\\n] any character EXCEPT an uppercase letter or - a newline - r* zero or more r's, where r is any regular expression - r+ one or more r's - r? zero or one r's (that is, "an optional r") - r{2,5} anywhere from two to five r's - r{2,} two or more r's - r{4} exactly 4 r's - {name} the expansion of the "name" definition - (see above) - "[xyz]\\"foo" - the literal string: [xyz]"foo - \\X if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v', - then the ANSI-C interpretation of \\x. - Otherwise, a literal 'X' (used to escape - operators such as '*') - \\123 the character with octal value 123 - \\x2a the character with hexadecimal value 2a - (r) match an r; parentheses are used to override - precedence (see below) - - - rs the regular expression r followed by the - regular expression s; called "concatenation" - - - r|s either an r or an s - - - r/s an r but only if it is followed by an s. The - s is not part of the matched text. This type - of pattern is called as "trailing context". - ^r an r, but only at the beginning of a line - r$ an r, but only at the end of a line. Equivalent - to "r/\\n". - - - r an r, but only in start condition s (see - below for discussion of start conditions) - r - same, but in any of start conditions s1, - s2, or s3 - - - <> an end-of-file - <> - an end-of-file when in start condition s1 or s2 - -.fi -The regular expressions listed above are grouped according to -precedence, from highest precedence at the top to lowest at the bottom. -Those grouped together have equal precedence. -.LP -Some notes on patterns: -.IP - -Negated character classes -.I match newlines -unless "\\n" (or an equivalent escape sequence) is one of the -characters explicitly present in the negated character class -(e.g., "[^A-Z\\n]"). -.IP - -A rule can have at most one instance of trailing context (the '/' operator -or the '$' operator). The start condition, '^', and "<>" patterns -can only occur at the beginning of a pattern, and, as well as with '/' and '$', -cannot be grouped inside parentheses. The following are all illegal: -.nf - - foo/bar$ - foo|(bar$) - foo|^bar - foobar - -.fi -.SH SUMMARY OF SPECIAL ACTIONS -In addition to arbitrary C code, the following can appear in actions: -.IP - -.B ECHO -copies yytext to the scanner's output. -.IP - -.B BEGIN -followed by the name of a start condition places the scanner in the -corresponding start condition. -.IP - -.B REJECT -directs the scanner to proceed on to the "second best" rule which matched the -input (or a prefix of the input). -.B yytext -and -.B yyleng -are set up appropriately. Note that -.B REJECT -is a particularly expensive feature in terms scanner performance; -if it is used in -.I any -of the scanner's actions it will slow down -.I all -of the scanner's matching. Furthermore, -.B REJECT -cannot be used with the -.I -f -or -.I -F -options. -.IP -Note also that unlike the other special actions, -.B REJECT -is a -.I branch; -code immediately following it in the action will -.I not -be executed. -.IP - -.B yymore() -tells the scanner that the next time it matches a rule, the corresponding -token should be -.I appended -onto the current value of -.B yytext -rather than replacing it. -.IP - -.B yyless(n) -returns all but the first -.I n -characters of the current token back to the input stream, where they -will be rescanned when the scanner looks for the next match. -.B yytext -and -.B yyleng -are adjusted appropriately (e.g., -.B yyleng -will now be equal to -.I n -). -.IP - -.B unput(c) -puts the character -.I c -back onto the input stream. It will be the next character scanned. -.IP - -.B input() -reads the next character from the input stream (this routine is called -.B yyinput() -if the scanner is compiled using -.B C++). -.IP - -.B yyterminate() -can be used in lieu of a return statement in an action. It terminates -the scanner and returns a 0 to the scanner's caller, indicating "all done". -.IP -By default, -.B yyterminate() -is also called when an end-of-file is encountered. It is a macro and -may be redefined. -.IP - -.B YY_NEW_FILE -is an action available only in <> rules. It means "Okay, I've -set up a new input file, continue scanning". -.IP - -.B yy_create_buffer( file, size ) -takes a -.I FILE -pointer and an integer -.I size. -It returns a YY_BUFFER_STATE -handle to a new input buffer large enough to accomodate -.I size -characters and associated with the given file. When in doubt, use -.B YY_BUF_SIZE -for the size. -.IP - -.B yy_switch_to_buffer( new_buffer ) -switches the scanner's processing to scan for tokens from -the given buffer, which must be a YY_BUFFER_STATE. -.IP - -.B yy_delete_buffer( buffer ) -deletes the given buffer. -.SH VALUES AVAILABLE TO THE USER -.IP - -.B char *yytext -holds the text of the current token. It may not be modified. -.IP - -.B int yyleng -holds the length of the current token. It may not be modified. -.IP - -.B FILE *yyin -is the file which by default -.I flex -reads from. It may be redefined but doing so only makes sense before -scanning begins. Changing it in the middle of scanning will have -unexpected results since -.I flex -buffers its input. Once scanning terminates because an end-of-file -has been seen, -.B -void yyrestart( FILE *new_file ) -may be called to point -.I yyin -at the new input file. -.IP - -.B FILE *yyout -is the file to which -.B ECHO -actions are done. It can be reassigned by the user. -.IP - -.B YY_CURRENT_BUFFER -returns a -.B YY_BUFFER_STATE -handle to the current buffer. -.SH MACROS THE USER CAN REDEFINE -.IP - -.B YY_DECL -controls how the scanning routine is declared. -By default, it is "int yylex()", or, if prototypes are being -used, "int yylex(void)". This definition may be changed by redefining -the "YY_DECL" macro. Note that -if you give arguments to the scanning routine using a -K&R-style/non-prototyped function declaration, you must terminate -the definition with a semi-colon (;). -.IP - -The nature of how the scanner -gets its input can be controlled by redefining the -.B YY_INPUT -macro. -YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)". Its -action is to place up to -.I max_size -characters in the character array -.I buf -and return in the integer variable -.I result -either the -number of characters read or the constant YY_NULL (0 on Unix systems) -to indicate EOF. The default YY_INPUT reads from the -global file-pointer "yyin". -A sample redefinition of YY_INPUT (in the definitions -section of the input file): -.nf - - %{ - #undef YY_INPUT - #define YY_INPUT(buf,result,max_size) \\ - { \\ - int c = getchar(); \\ - result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\ - } - %} - -.fi -.IP - -When the scanner receives an end-of-file indication from YY_INPUT, -it then checks the -.B yywrap() -function. If -.B yywrap() -returns false (zero), then it is assumed that the -function has gone ahead and set up -.I yyin -to point to another input file, and scanning continues. If it returns -true (non-zero), then the scanner terminates, returning 0 to its -caller. -.IP -The default -.B yywrap() -always returns 1. Presently, to redefine it you must first -"#undef yywrap", as it is currently implemented as a macro. It is -likely that -.B yywrap() -will soon be defined to be a function rather than a macro. -.IP - -YY_USER_ACTION -can be redefined to provide an action -which is always executed prior to the matched rule's action. -.IP - -The macro -.B YY_USER_INIT -may be redefined to provide an action which is always executed before -the first scan. -.IP - -In the generated scanner, the actions are all gathered in one large -switch statement and separated using -.B YY_BREAK, -which may be redefined. By default, it is simply a "break", to separate -each rule's action from the following rule's. -.SH FILES -.TP -.I flex.skel -skeleton scanner. -.TP -.I lex.yy.c -generated scanner (called -.I lexyy.c -on some systems). -.TP -.I lex.backtrack -backtracking information for -.B -b -flag (called -.I lex.bck -on some systems). -.TP -.B -lfl -library with which to link the scanners. -.SH "SEE ALSO" -.LP -flexdoc(1), lex(1), yacc(1), sed(1), awk(1). -.LP -M. E. Lesk and E. Schmidt, -.I LEX - Lexical Analyzer Generator -.SH DIAGNOSTICS -.I reject_used_but_not_detected undefined -or -.LP -.I yymore_used_but_not_detected undefined - -These errors can occur at compile time. They indicate that the -scanner uses -.B REJECT -or -.B yymore() -but that -.I flex -failed to notice the fact, meaning that -.I flex -scanned the first two sections looking for occurrences of these actions -and failed to find any, but somehow you snuck some in (via a #include -file, for example). Make an explicit reference to the action in your -.I flex -input file. (Note that previously -.I flex -supported a -.B %used/%unused -mechanism for dealing with this problem; this feature is still supported -but now deprecated, and will go away soon unless the author hears from -people who can argue compellingly that they need it.) -.LP -.I flex scanner jammed - -a scanner compiled with -.B -s -has encountered an input string which wasn't matched by -any of its rules. -.LP -.I flex input buffer overflowed - -a scanner rule matched a string long enough to overflow the -scanner's internal input buffer (16K bytes - controlled by -.B YY_BUF_MAX -in "flex.skel"). -.LP -.I scanner requires -8 flag - -Your scanner specification includes recognizing 8-bit characters and -you did not specify the -8 flag (and your site has not installed flex -with -8 as the default). -.LP -.I -fatal flex scanner internal error--end of buffer missed - -This can occur in an scanner which is reentered after a long-jump -has jumped out (or over) the scanner's activation frame. Before -reentering the scanner, use: -.nf - - yyrestart( yyin ); - -.fi -.LP -.I too many %t classes! - -You managed to put every single character into its own %t class. -.I flex -requires that at least one of the classes share characters. -.SH AUTHOR -Vern Paxson, with the help of many ideas and much inspiration from -Van Jacobson. Original version by Jef Poskanzer. -.LP -See flexdoc(1) for additional credits and the address to send comments to. -.SH DEFICIENCIES / BUGS -.LP -Some trailing context -patterns cannot be properly matched and generate -warning messages ("Dangerous trailing context"). These are -patterns where the ending of the -first part of the rule matches the beginning of the second -part, such as "zx*/xy*", where the 'x*' matches the 'x' at -the beginning of the trailing context. (Note that the POSIX draft -states that the text matched by such patterns is undefined.) -.LP -For some trailing context rules, parts which are actually fixed-length are -not recognized as such, leading to the abovementioned performance loss. -In particular, parts using '|' or {n} (such as "foo{3}") are always -considered variable-length. -.LP -Combining trailing context with the special '|' action can result in -.I fixed -trailing context being turned into the more expensive -.I variable -trailing context. For example, this happens in the following example: -.nf - - %% - abc | - xyz/def - -.fi -.LP -Use of unput() invalidates yytext and yyleng. -.LP -Use of unput() to push back more text than was matched can -result in the pushed-back text matching a beginning-of-line ('^') -rule even though it didn't come at the beginning of the line -(though this is rare!). -.LP -Pattern-matching of NUL's is substantially slower than matching other -characters. -.LP -.I flex -does not generate correct #line directives for code internal -to the scanner; thus, bugs in -.I flex.skel -yield bogus line numbers. -.LP -Due to both buffering of input and read-ahead, you cannot intermix -calls to routines, such as, for example, -.B getchar(), -with -.I flex -rules and expect it to work. Call -.B input() -instead. -.LP -The total table entries listed by the -.B -v -flag excludes the number of table entries needed to determine -what rule has been matched. The number of entries is equal -to the number of DFA states if the scanner does not use -.B REJECT, -and somewhat greater than the number of states if it does. -.LP -.B REJECT -cannot be used with the -.I -f -or -.I -F -options. -.LP -Some of the macros, such as -.B yywrap(), -may in the future become functions which live in the -.B -lfl -library. This will doubtless break a lot of code, but may be -required for POSIX-compliance. -.LP -The -.I flex -internal algorithms need documentation. diff --git a/util/flex/flex.skel b/util/flex/flex.skel deleted file mode 100644 index e97303452..000000000 --- a/util/flex/flex.skel +++ /dev/null @@ -1,858 +0,0 @@ -/* A lexical scanner generated by flex */ - -/* scanner skeleton version: - * $Id$ - */ - -#define FLEX_SCANNER - -#define ACK_MOD - -#include - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include -#include - -/* use prototypes in function declarations */ -#define YY_USE_PROTOS - -/* the "const" storage-class-modifier is valid */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#ifdef __STDC__ - -#ifdef __GNUC__ -#include -void *malloc( size_t ); -void free( void* ); -#else -#include -#endif /* __GNUC__ */ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - - -#ifdef __TURBOC__ -#define YY_USE_CONST -#endif - - -#ifndef YY_USE_CONST -#define const -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -/* we can't get here if it's an ANSI C compiler, or a C++ compiler, - * so it's got to be a K&R compiler, and therefore there's no standard - * place from which to include these definitions - */ -char *malloc(); -int free(); -int read(); -#endif - - -/* amount of stuff to slurp up with each read */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* returned upon end-of-file */ -#define YY_END_TOK 0 - -/* copy whatever the last rule matched to the standard output */ - -/* cast to (char *) is because for 8-bit chars, yytext is (unsigned char *) */ -/* this used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite() - */ -#define ECHO (void) fwrite( (char *) yytext, yyleng, 1, yyout ) - -/* gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#define YY_INPUT(buf,result,max_size) \ - if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ - YY_FATAL_ERROR( "read() in flex scanner failed" ); -#define YY_NULL 0 - -/* no semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#define yyterminate() return ( YY_NULL ) - -/* report a fatal error */ - -/* The funky do-while is used to turn this macro definition into - * a single C statement (which needs a semi-colon terminator). - * This avoids problems with code like: - * - * if ( something_happens ) - * YY_FATAL_ERROR( "oops, the something happened" ); - * else - * everything_okay(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the YY_FATAL_ERROR() call. - */ - -#define YY_FATAL_ERROR(msg) \ - do \ - { \ - (void) fputs( msg, stderr ); \ - (void) putc( '\n', stderr ); \ - exit( 1 ); \ - } \ - while ( 0 ) - -/* default yywrap function - always treat EOF as an EOF */ -#define yywrap() 1 - -/* enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN - */ -#define BEGIN yy_start = 1 + 2 * - -/* action number for EOF rule of a given start state */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* special action meaning "start processing a new file" */ -#define YY_NEW_FILE \ - do \ - { \ - yy_init_buffer( yy_current_buffer, yyin ); \ - yy_load_buffer_state(); \ - } \ - while ( 0 ) - -/* default declaration of generated scanner - a define so the user can - * easily add parameters - */ -#define YY_DECL int yylex YY_PROTO(( void )) - -/* code executed at the end of each rule */ -#define YY_BREAK break; - -#define YY_END_OF_BUFFER_CHAR 0 - -#ifndef YY_BUF_SIZE -#define YY_BUF_SIZE (YY_READ_BUF_SIZE * 2) /* size of default input buffer */ -#endif - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -%% section 1 definitions go here - -/* done after the current pattern has been matched and before the - * corresponding action - sets up yytext - */ -#define YY_DO_BEFORE_ACTION \ - yytext = yy_bp; \ -%% code to fiddle yytext and yyleng for yymore() goes here - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yy_c_buf_p = yy_cp; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* return all but the first 'n' matched characters back to the input stream */ -#define yyless(n) \ - do \ - { \ - /* undo effects of setting up yytext */ \ - *yy_cp = yy_hold_char; \ - yy_c_buf_p = yy_cp = yy_bp + n; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, yytext ) - - -struct yy_buffer_state - { - FILE *yy_input_file; - - YY_CHAR *yy_ch_buf; /* input buffer */ - YY_CHAR *yy_buf_pos; /* current position in input buffer */ - - /* size of input buffer in bytes, not including room for EOB characters*/ - int yy_buf_size; - - /* number of characters read into yy_ch_buf, not including EOB characters */ - int yy_n_chars; - - int yy_eof_status; /* whether we've seen an EOF on this buffer */ -#define EOF_NOT_SEEN 0 - /* "pending" happens when the EOF has been seen but there's still - * some text process - */ -#define EOF_PENDING 1 -#define EOF_DONE 2 - }; - -static YY_BUFFER_STATE yy_current_buffer; - -/* we provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state" - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -/* yy_hold_char holds the character lost when yytext is formed */ -static YY_CHAR yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - - -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -#ifndef YY_USER_INIT -#define YY_USER_INIT -#endif - -extern YY_CHAR *yytext; -extern int yyleng; -extern FILE *yyin, *yyout; - -YY_CHAR *yytext; -int yyleng; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; - -%% data tables for the DFA go here - -/* these variables are all declared out here so that section 3 code can - * manipulate them - */ -/* points to current character in buffer */ -static YY_CHAR *yy_c_buf_p = (YY_CHAR *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yyunput YY_PROTO(( YY_CHAR c, YY_CHAR *buf_ptr )); -void yyrestart YY_PROTO(( FILE *input_file )); -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); - -#define yy_new_buffer yy_create_buffer - -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif - -YY_DECL - { - register yy_state_type yy_current_state; - register YY_CHAR *yy_cp, *yy_bp; - register int yy_act; - -%% user's declarations go here - - if ( yy_init ) - { - YY_USER_INIT; - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( yy_current_buffer ) - yy_init_buffer( yy_current_buffer, yyin ); - else - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - - yy_init = 0; - } - - while ( 1 ) /* loops until end-of-file is reached */ - { -%% yymore()-related code goes here - yy_cp = yy_c_buf_p; - - /* support of yytext */ - *yy_cp = yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of the - * current run. - */ - yy_bp = yy_cp; - -%% code to set up and find next match goes here - -yy_find_action: -%% code to find the action number goes here - - YY_DO_BEFORE_ACTION; - YY_USER_ACTION; - -do_action: /* this label is used only to access EOF actions */ - -%% debug code goes here - - switch ( yy_act ) - { -%% actions go here - - case YY_END_OF_BUFFER: - { - /* amount of text matched not including the EOB char */ - int yy_amount_of_matched_text = yy_cp - yytext - 1; - - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yy_hold_char; - - /* note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the end- - * of-buffer state). Contrast this with the test in yyinput(). - */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* this was really a NUL */ - { - yy_state_type yy_next_state; - - yy_c_buf_p = yytext + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - /* okay, we're now positioned to make the - * NUL transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we - * don't want to build jamming into it because - * then it will run more slowly) - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = yytext + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* consume the NUL */ - yy_cp = ++yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { -%% code to do backtracking for compressed tables and set up yy_cp goes here - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* note: because we've taken care in - * yy_get_next_buffer() to have set up yytext, - * we can now set up yy_c_buf_p so that if some - * total hoser (like flex itself) wants - * to call the scanner after we return the - * YY_NULL, it'll still work - another YY_NULL - * will get returned. - */ - yy_c_buf_p = yytext + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF((yy_start - 1) / 2); - goto do_action; - } - - else - { - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - } - break; - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: -#ifdef FLEX_DEBUG - printf( "action # %d\n", yy_act ); -#endif - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } - } - } - - -/* yy_get_next_buffer - try to read in a new buffer - * - * synopsis - * int yy_get_next_buffer(); - * - * returns a code representing an action - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ - -static int yy_get_next_buffer() - - { - register YY_CHAR *dest = yy_current_buffer->yy_ch_buf; - register YY_CHAR *source = yytext - 1; /* copy prev. char, too */ - register int number_to_move, i; - int ret_val; - - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - /* try to read more data */ - - /* first move last chars to start of buffer */ - number_to_move = yy_c_buf_p - yytext; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( yy_current_buffer->yy_eof_status != EOF_NOT_SEEN ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - yy_n_chars = 0; - - else - { - int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - else if ( num_to_read <= 0 ) - YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); - - /* read in more data */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - } - - if ( yy_n_chars == 0 ) - { - if ( number_to_move == 1 ) - { - ret_val = EOB_ACT_END_OF_FILE; - yy_current_buffer->yy_eof_status = EOF_DONE; - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_eof_status = EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - /* yytext begins at the second character in yy_ch_buf; the first - * character is the one which preceded it before reading in the latest - * buffer; it needs to be kept around in case it's a newline, so - * yy_get_previous_state() will have with '^' rules active - */ - - yytext = &yy_current_buffer->yy_ch_buf[1]; - - return ( ret_val ); - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached - * - * synopsis - * yy_state_type yy_get_previous_state(); - */ - -static yy_state_type yy_get_previous_state() - - { - register yy_state_type yy_current_state; - register YY_CHAR *yy_cp; - -%% code to get the start state into yy_current_state goes here - - for ( yy_cp = yytext + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { -%% code to find the next state goes here - } - - return ( yy_current_state ); - } - - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( register yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -register yy_state_type yy_current_state; -#endif - - { - register int yy_is_jam; -%% code to find the next state, and perhaps do backtracking, goes here - - return ( yy_is_jam ? 0 : yy_current_state ); - } - - -#ifdef YY_USE_PROTOS -static void yyunput( YY_CHAR c, register YY_CHAR *yy_bp ) -#else -static void yyunput( c, yy_bp ) -YY_CHAR c; -register YY_CHAR *yy_bp; -#endif - - { - register YY_CHAR *yy_cp = yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - register int number_to_move = yy_n_chars + 2; /* +2 for EOB chars */ - register YY_CHAR *dest = - &yy_current_buffer->yy_ch_buf[yy_current_buffer->yy_buf_size + 2]; - register YY_CHAR *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; - - while ( source > yy_current_buffer->yy_ch_buf ) - *--dest = *--source; - - yy_cp += dest - source; - yy_bp += dest - source; - yy_n_chars = yy_current_buffer->yy_buf_size; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - if ( yy_cp > yy_bp && yy_cp[-1] == '\n' ) - yy_cp[-2] = '\n'; - - *--yy_cp = c; - - /* note: the formal parameter *must* be called "yy_bp" for this - * macro to now work correctly - */ - YY_DO_BEFORE_ACTION; /* set up yytext again */ - } - - -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif - - { - int c; - YY_CHAR *yy_cp = yy_c_buf_p; - - *yy_cp = yy_hold_char; - - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* this was really a NUL */ - *yy_c_buf_p = '\0'; - - else - { /* need more input */ - yytext = yy_c_buf_p; - ++yy_c_buf_p; - - switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - { - yy_c_buf_p = yytext + YY_MORE_ADJ; - return ( EOF ); - } - - YY_NEW_FILE; - -#ifdef __cplusplus - return ( yyinput() ); -#else - return ( input() ); -#endif - } - break; - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext + YY_MORE_ADJ; - break; - - case EOB_ACT_LAST_MATCH: -#ifdef __cplusplus - YY_FATAL_ERROR( "unexpected last match in yyinput()" ); -#else - YY_FATAL_ERROR( "unexpected last match in input()" ); -#endif - } - } - } - - c = *yy_c_buf_p; - yy_hold_char = *++yy_c_buf_p; - - return ( c ); - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - - { - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - - { - if ( yy_current_buffer == new_buffer ) - return; - - if ( yy_current_buffer ) - { - /* flush out information for old buffer */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* we don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) malloc( sizeof( struct yy_buffer_state ) ); - - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (YY_CHAR *) malloc( (unsigned) (b->yy_buf_size + 2) ); - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - yy_init_buffer( b, file ); - - return ( b ); - } - - -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - - { - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - free( (char *) b->yy_ch_buf ); - free( (char *) b ); - } - - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - - { - b->yy_input_file = file; - - /* we put in the '\n' and start reading from [1] so that an - * initial match-at-newline will be true. - */ - - b->yy_ch_buf[0] = '\n'; - b->yy_n_chars = 1; - - /* we always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[1]; - - b->yy_eof_status = EOF_NOT_SEEN; - } - -#ifdef ACK_MOD -/* redefine yyless() so that it does not access local variables of YYDECL */ - -#undef yyless - -/* return all but the first 'n' matched characters back to the input stream */ -#define yyless(n) \ - do \ - { \ - /* undo effects of setting up yytext */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - -#endif /* ACK_MOD */ diff --git a/util/flex/flexdef.h b/util/flex/flexdef.h deleted file mode 100644 index aa0ea46c6..000000000 --- a/util/flex/flexdef.h +++ /dev/null @@ -1,877 +0,0 @@ -/* flexdef - definitions file for flex */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* @(#) $Id$ (LBL) */ - -#ifndef FILE -#include -#endif - -/* always be prepared to generate an 8-bit scanner */ -#define FLEX_8_BIT_CHARS - -#ifdef FLEX_8_BIT_CHARS -#define CSIZE 256 -#define Char unsigned char -#else -#define Char char -#define CSIZE 128 -#endif - -/* size of input alphabet - should be size of ASCII set */ -#ifndef DEFAULT_CSIZE -#define DEFAULT_CSIZE 128 -#endif - -#ifndef PROTO -#ifdef __STDC__ -#define PROTO(proto) proto -#else -#define PROTO(proto) () -#endif -#endif - - -#ifndef ACK_MOD -#ifdef USG -#define SYS_V -#endif - -#ifdef SYS_V -#include -#else - -#include -#ifdef lint -char *sprintf(); /* keep lint happy */ -#endif -#ifdef SCO_UNIX -void *memset(); -#else -char *memset(); -#endif -#endif -#else /* ACK_MOD */ -extern char *strcpy(); -#endif /* ACK_MOD */ - -#ifndef ACK_MOD -#ifdef AMIGA -#define bzero(s, n) setmem((char *)(s), n, '\0') -#ifndef abs -#define abs(x) ((x) < 0 ? -(x) : (x)) -#endif -#else -#define bzero(s, n) (void) memset((char *)(s), '\0', n) -#endif -#endif /* not ACK_MOD */ - -#ifdef VMS -#define unlink delete -#define SHORT_FILE_NAMES -#endif - -#ifdef __STDC__ - -#ifdef __GNUC__ -#include -void *malloc( size_t ); -void free( void* ); -#else -#include -#endif - -#else /* ! __STDC__ */ -char *malloc(), *realloc(); -#endif - - -/* maximum line length we'll have to deal with */ -#define MAXLINE BUFSIZ - -/* maximum size of file name */ -#define FILENAMESIZE 1024 - -#ifndef min -#define min(x,y) ((x) < (y) ? (x) : (y)) -#endif -#ifndef max -#define max(x,y) ((x) > (y) ? (x) : (y)) -#endif - -#ifdef MS_DOS -#ifndef abs -#define abs(x) ((x) < 0 ? -(x) : (x)) -#endif -#define SHORT_FILE_NAMES -#endif - -#define true 1 -#define false 0 - - -#ifndef DEFAULT_SKELETON_FILE -#define DEFAULT_SKELETON_FILE "flex.skel" -#endif - -/* special chk[] values marking the slots taking by end-of-buffer and action - * numbers - */ -#define EOB_POSITION -1 -#define ACTION_POSITION -2 - -/* number of data items per line for -f output */ -#define NUMDATAITEMS 10 - -/* number of lines of data in -f output before inserting a blank line for - * readability. - */ -#define NUMDATALINES 10 - -/* transition_struct_out() definitions */ -#define TRANS_STRUCT_PRINT_LENGTH 15 - -/* returns true if an nfa state has an epsilon out-transition slot - * that can be used. This definition is currently not used. - */ -#define FREE_EPSILON(state) \ - (transchar[state] == SYM_EPSILON && \ - trans2[state] == NO_TRANSITION && \ - finalst[state] != state) - -/* returns true if an nfa state has an epsilon out-transition character - * and both slots are free - */ -#define SUPER_FREE_EPSILON(state) \ - (transchar[state] == SYM_EPSILON && \ - trans1[state] == NO_TRANSITION) \ - -/* maximum number of NFA states that can comprise a DFA state. It's real - * big because if there's a lot of rules, the initial state will have a - * huge epsilon closure. - */ -#define INITIAL_MAX_DFA_SIZE 750 -#define MAX_DFA_SIZE_INCREMENT 750 - - -/* a note on the following masks. They are used to mark accepting numbers - * as being special. As such, they implicitly limit the number of accepting - * numbers (i.e., rules) because if there are too many rules the rule numbers - * will overload the mask bits. Fortunately, this limit is \large/ (0x2000 == - * 8192) so unlikely to actually cause any problems. A check is made in - * new_rule() to ensure that this limit is not reached. - */ - -/* mask to mark a trailing context accepting number */ -#define YY_TRAILING_MASK 0x2000 - -/* mask to mark the accepting number of the "head" of a trailing context rule */ -#define YY_TRAILING_HEAD_MASK 0x4000 - -/* maximum number of rules, as outlined in the above note */ -#define MAX_RULE (YY_TRAILING_MASK - 1) - - -/* NIL must be 0. If not, its special meaning when making equivalence classes - * (it marks the representative of a given e.c.) will be unidentifiable - */ -#define NIL 0 - -#define JAM -1 /* to mark a missing DFA transition */ -#define NO_TRANSITION NIL -#define UNIQUE -1 /* marks a symbol as an e.c. representative */ -#define INFINITY -1 /* for x{5,} constructions */ - -#define INITIAL_MAX_CCLS 100 /* max number of unique character classes */ -#define MAX_CCLS_INCREMENT 100 - -/* size of table holding members of character classes */ -#define INITIAL_MAX_CCL_TBL_SIZE 500 -#define MAX_CCL_TBL_SIZE_INCREMENT 250 - -#define INITIAL_MAX_RULES 100 /* default maximum number of rules */ -#define MAX_RULES_INCREMENT 100 - -#define INITIAL_MNS 2000 /* default maximum number of nfa states */ -#define MNS_INCREMENT 1000 /* amount to bump above by if it's not enough */ - -#define INITIAL_MAX_DFAS 1000 /* default maximum number of dfa states */ -#define MAX_DFAS_INCREMENT 1000 - -#define JAMSTATE -32766 /* marks a reference to the state that always jams */ - -/* enough so that if it's subtracted from an NFA state number, the result - * is guaranteed to be negative - */ -#define MARKER_DIFFERENCE 32000 -#define MAXIMUM_MNS 31999 - -/* maximum number of nxt/chk pairs for non-templates */ -#define INITIAL_MAX_XPAIRS 2000 -#define MAX_XPAIRS_INCREMENT 2000 - -/* maximum number of nxt/chk pairs needed for templates */ -#define INITIAL_MAX_TEMPLATE_XPAIRS 2500 -#define MAX_TEMPLATE_XPAIRS_INCREMENT 2500 - -#define SYM_EPSILON (CSIZE + 1) /* to mark transitions on the symbol epsilon */ - -#define INITIAL_MAX_SCS 40 /* maximum number of start conditions */ -#define MAX_SCS_INCREMENT 40 /* amount to bump by if it's not enough */ - -#define ONE_STACK_SIZE 500 /* stack of states with only one out-transition */ -#define SAME_TRANS -1 /* transition is the same as "default" entry for state */ - -/* the following percentages are used to tune table compression: - - * the percentage the number of out-transitions a state must be of the - * number of equivalence classes in order to be considered for table - * compaction by using protos - */ -#define PROTO_SIZE_PERCENTAGE 15 - -/* the percentage the number of homogeneous out-transitions of a state - * must be of the number of total out-transitions of the state in order - * that the state's transition table is first compared with a potential - * template of the most common out-transition instead of with the first - * proto in the proto queue - */ -#define CHECK_COM_PERCENTAGE 50 - -/* the percentage the number of differences between a state's transition - * table and the proto it was first compared with must be of the total - * number of out-transitions of the state in order to keep the first - * proto as a good match and not search any further - */ -#define FIRST_MATCH_DIFF_PERCENTAGE 10 - -/* the percentage the number of differences between a state's transition - * table and the most similar proto must be of the state's total number - * of out-transitions to use the proto as an acceptable close match - */ -#define ACCEPTABLE_DIFF_PERCENTAGE 50 - -/* the percentage the number of homogeneous out-transitions of a state - * must be of the number of total out-transitions of the state in order - * to consider making a template from the state - */ -#define TEMPLATE_SAME_PERCENTAGE 60 - -/* the percentage the number of differences between a state's transition - * table and the most similar proto must be of the state's total number - * of out-transitions to create a new proto from the state - */ -#define NEW_PROTO_DIFF_PERCENTAGE 20 - -/* the percentage the total number of out-transitions of a state must be - * of the number of equivalence classes in order to consider trying to - * fit the transition table into "holes" inside the nxt/chk table. - */ -#define INTERIOR_FIT_PERCENTAGE 15 - -/* size of region set aside to cache the complete transition table of - * protos on the proto queue to enable quick comparisons - */ -#define PROT_SAVE_SIZE 2000 - -#define MSP 50 /* maximum number of saved protos (protos on the proto queue) */ - -/* maximum number of out-transitions a state can have that we'll rummage - * around through the interior of the internal fast table looking for a - * spot for it - */ -#define MAX_XTIONS_FULL_INTERIOR_FIT 4 - -/* maximum number of rules which will be reported as being associated - * with a DFA state - */ -#define MAX_ASSOC_RULES 100 - -/* number that, if used to subscript an array, has a good chance of producing - * an error; should be small enough to fit into a short - */ -#define BAD_SUBSCRIPT -32767 - -/* absolute value of largest number that can be stored in a short, with a - * bit of slop thrown in for general paranoia. - */ -#define MAX_SHORT 32766 - - -/* Declarations for global variables. */ - -/* variables for symbol tables: - * sctbl - start-condition symbol table - * ndtbl - name-definition symbol table - * ccltab - character class text symbol table - */ - -struct hash_entry - { - struct hash_entry *prev, *next; - char *name; - char *str_val; - int int_val; - } ; - -typedef struct hash_entry *hash_table[]; - -#define NAME_TABLE_HASH_SIZE 101 -#define START_COND_HASH_SIZE 101 -#define CCL_HASH_SIZE 101 - -extern struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE]; -extern struct hash_entry *sctbl[START_COND_HASH_SIZE]; -extern struct hash_entry *ccltab[CCL_HASH_SIZE]; - - -/* variables for flags: - * printstats - if true (-v), dump statistics - * syntaxerror - true if a syntax error has been found - * eofseen - true if we've seen an eof in the input file - * ddebug - if true (-d), make a "debug" scanner - * trace - if true (-T), trace processing - * spprdflt - if true (-s), suppress the default rule - * interactive - if true (-I), generate an interactive scanner - * caseins - if true (-i), generate a case-insensitive scanner - * useecs - if true (-Ce flag), use equivalence classes - * fulltbl - if true (-Cf flag), don't compress the DFA state table - * usemecs - if true (-Cm flag), use meta-equivalence classes - * fullspd - if true (-F flag), use Jacobson method of table representation - * gen_line_dirs - if true (i.e., no -L flag), generate #line directives - * performance_report - if true (i.e., -p flag), generate a report relating - * to scanner performance - * backtrack_report - if true (i.e., -b flag), generate "lex.backtrack" file - * listing backtracking states - * csize - size of character set for the scanner we're generating; - * 128 for 7-bit chars and 256 for 8-bit - * yymore_used - if true, yymore() is used in input rules - * reject - if true, generate backtracking tables for REJECT macro - * real_reject - if true, scanner really uses REJECT (as opposed to just - * having "reject" set for variable trailing context) - * continued_action - true if this rule's action is to "fall through" to - * the next rule's action (i.e., the '|' action) - * yymore_really_used - has a REALLY_xxx value indicating whether a - * %used or %notused was used with yymore() - * reject_really_used - same for REJECT - */ - -extern int printstats, syntaxerror, eofseen, ddebug, trace, spprdflt; -extern int interactive, caseins, useecs, fulltbl, usemecs; -extern int fullspd, gen_line_dirs, performance_report, backtrack_report, csize; -extern int yymore_used, reject, real_reject, continued_action; - -#define REALLY_NOT_DETERMINED 0 -#define REALLY_USED 1 -#define REALLY_NOT_USED 2 -extern int yymore_really_used, reject_really_used; - - -/* variables used in the flex input routines: - * datapos - characters on current output line - * dataline - number of contiguous lines of data in current data - * statement. Used to generate readable -f output - * linenum - current input line number - * skelfile - the skeleton file - * yyin - input file - * temp_action_file - temporary file to hold actions - * backtrack_file - file to summarize backtracking states to - * infilename - name of input file - * action_file_name - name of the temporary file - * input_files - array holding names of input files - * num_input_files - size of input_files array - * program_name - name with which program was invoked - */ - -extern int datapos, dataline, linenum; -extern FILE *skelfile, *yyin, *temp_action_file, *backtrack_file; -extern char *infilename; -extern char *action_file_name; -extern char **input_files; -extern int num_input_files; -extern char *program_name; - - -/* variables for stack of states having only one out-transition: - * onestate - state number - * onesym - transition symbol - * onenext - target state - * onedef - default base entry - * onesp - stack pointer - */ - -extern int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE]; -extern int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp; - - -/* variables for nfa machine data: - * current_mns - current maximum on number of NFA states - * num_rules - number of the last accepting state; also is number of - * rules created so far - * current_max_rules - current maximum number of rules - * lastnfa - last nfa state number created - * firstst - physically the first state of a fragment - * lastst - last physical state of fragment - * finalst - last logical state of fragment - * transchar - transition character - * trans1 - transition state - * trans2 - 2nd transition state for epsilons - * accptnum - accepting number - * assoc_rule - rule associated with this NFA state (or 0 if none) - * state_type - a STATE_xxx type identifying whether the state is part - * of a normal rule, the leading state in a trailing context - * rule (i.e., the state which marks the transition from - * recognizing the text-to-be-matched to the beginning of - * the trailing context), or a subsequent state in a trailing - * context rule - * rule_type - a RULE_xxx type identifying whether this a a ho-hum - * normal rule or one which has variable head & trailing - * context - * rule_linenum - line number associated with rule - */ - -extern int current_mns, num_rules, current_max_rules, lastnfa; -extern int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2; -extern int *accptnum, *assoc_rule, *state_type, *rule_type, *rule_linenum; - -/* different types of states; values are useful as masks, as well, for - * routines like check_trailing_context() - */ -#define STATE_NORMAL 0x1 -#define STATE_TRAILING_CONTEXT 0x2 - -/* global holding current type of state we're making */ - -extern int current_state_type; - -/* different types of rules */ -#define RULE_NORMAL 0 -#define RULE_VARIABLE 1 - -/* true if the input rules include a rule with both variable-length head - * and trailing context, false otherwise - */ -extern int variable_trailing_context_rules; - - -/* variables for protos: - * numtemps - number of templates created - * numprots - number of protos created - * protprev - backlink to a more-recently used proto - * protnext - forward link to a less-recently used proto - * prottbl - base/def table entry for proto - * protcomst - common state of proto - * firstprot - number of the most recently used proto - * lastprot - number of the least recently used proto - * protsave contains the entire state array for protos - */ - -extern int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP]; -extern int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE]; - - -/* variables for managing equivalence classes: - * numecs - number of equivalence classes - * nextecm - forward link of Equivalence Class members - * ecgroup - class number or backward link of EC members - * nummecs - number of meta-equivalence classes (used to compress - * templates) - * tecfwd - forward link of meta-equivalence classes members - * tecbck - backward link of MEC's - * xlation - maps character codes to their translations, or nil if no %t table - * num_xlations - number of different xlation values - */ - -/* reserve enough room in the equivalence class arrays so that we - * can use the CSIZE'th element to hold equivalence class information - * for the NUL character. Later we'll move this information into - * the 0th element. - */ -extern int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs; - -/* meta-equivalence classes are indexed starting at 1, so it's possible - * that they will require positions from 1 .. CSIZE, i.e., CSIZE + 1 - * slots total (since the arrays are 0-based). nextecm[] and ecgroup[] - * don't require the extra position since they're indexed from 1 .. CSIZE - 1. - */ -extern int tecfwd[CSIZE + 1], tecbck[CSIZE + 1]; - -extern int *xlation; -extern int num_xlations; - - -/* variables for start conditions: - * lastsc - last start condition created - * current_max_scs - current limit on number of start conditions - * scset - set of rules active in start condition - * scbol - set of rules active only at the beginning of line in a s.c. - * scxclu - true if start condition is exclusive - * sceof - true if start condition has EOF rule - * scname - start condition name - * actvsc - stack of active start conditions for the current rule - */ - -extern int lastsc, current_max_scs, *scset, *scbol, *scxclu, *sceof, *actvsc; -extern char **scname; - - -/* variables for dfa machine data: - * current_max_dfa_size - current maximum number of NFA states in DFA - * current_max_xpairs - current maximum number of non-template xtion pairs - * current_max_template_xpairs - current maximum number of template pairs - * current_max_dfas - current maximum number DFA states - * lastdfa - last dfa state number created - * nxt - state to enter upon reading character - * chk - check value to see if "nxt" applies - * tnxt - internal nxt table for templates - * base - offset into "nxt" for given state - * def - where to go if "chk" disallows "nxt" entry - * nultrans - NUL transition for each state - * NUL_ec - equivalence class of the NUL character - * tblend - last "nxt/chk" table entry being used - * firstfree - first empty entry in "nxt/chk" table - * dss - nfa state set for each dfa - * dfasiz - size of nfa state set for each dfa - * dfaacc - accepting set for each dfa state (or accepting number, if - * -r is not given) - * accsiz - size of accepting set for each dfa state - * dhash - dfa state hash value - * numas - number of DFA accepting states created; note that this - * is not necessarily the same value as num_rules, which is the analogous - * value for the NFA - * numsnpairs - number of state/nextstate transition pairs - * jambase - position in base/def where the default jam table starts - * jamstate - state number corresponding to "jam" state - * end_of_buffer_state - end-of-buffer dfa state number - */ - -extern int current_max_dfa_size, current_max_xpairs; -extern int current_max_template_xpairs, current_max_dfas; -extern int lastdfa, lasttemp, *nxt, *chk, *tnxt; -extern int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz; -extern union dfaacc_union - { - int *dfaacc_set; - int dfaacc_state; - } *dfaacc; -extern int *accsiz, *dhash, numas; -extern int numsnpairs, jambase, jamstate; -extern int end_of_buffer_state; - -/* variables for ccl information: - * lastccl - ccl index of the last created ccl - * current_maxccls - current limit on the maximum number of unique ccl's - * cclmap - maps a ccl index to its set pointer - * ccllen - gives the length of a ccl - * cclng - true for a given ccl if the ccl is negated - * cclreuse - counts how many times a ccl is re-used - * current_max_ccl_tbl_size - current limit on number of characters needed - * to represent the unique ccl's - * ccltbl - holds the characters in each ccl - indexed by cclmap - */ - -extern int lastccl, current_maxccls, *cclmap, *ccllen, *cclng, cclreuse; -extern int current_max_ccl_tbl_size; -extern Char *ccltbl; - - -/* variables for miscellaneous information: - * starttime - real-time when we started - * endtime - real-time when we ended - * nmstr - last NAME scanned by the scanner - * sectnum - section number currently being parsed - * nummt - number of empty nxt/chk table entries - * hshcol - number of hash collisions detected by snstods - * dfaeql - number of times a newly created dfa was equal to an old one - * numeps - number of epsilon NFA states created - * eps2 - number of epsilon states which have 2 out-transitions - * num_reallocs - number of times it was necessary to realloc() a group - * of arrays - * tmpuses - number of DFA states that chain to templates - * totnst - total number of NFA states used to make DFA states - * peakpairs - peak number of transition pairs we had to store internally - * numuniq - number of unique transitions - * numdup - number of duplicate transitions - * hshsave - number of hash collisions saved by checking number of states - * num_backtracking - number of DFA states requiring back-tracking - * bol_needed - whether scanner needs beginning-of-line recognition - */ - -extern char *starttime, *endtime, nmstr[MAXLINE]; -extern int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs; -extern int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave; -extern int num_backtracking, bol_needed; - -void *allocate_array(), *reallocate_array(); - -#define allocate_integer_array(size) \ - (int *) allocate_array( size, sizeof( int ) ) - -#define reallocate_integer_array(array,size) \ - (int *) reallocate_array( (void *) array, size, sizeof( int ) ) - -#define allocate_int_ptr_array(size) \ - (int **) allocate_array( size, sizeof( int * ) ) - -#define allocate_char_ptr_array(size) \ - (char **) allocate_array( size, sizeof( char * ) ) - -#define allocate_dfaacc_union(size) \ - (union dfaacc_union *) \ - allocate_array( size, sizeof( union dfaacc_union ) ) - -#define reallocate_int_ptr_array(array,size) \ - (int **) reallocate_array( (void *) array, size, sizeof( int * ) ) - -#define reallocate_char_ptr_array(array,size) \ - (char **) reallocate_array( (void *) array, size, sizeof( char * ) ) - -#define reallocate_dfaacc_union(array, size) \ - (union dfaacc_union *) \ - reallocate_array( (void *) array, size, sizeof( union dfaacc_union ) ) - -#define allocate_character_array(size) \ - (Char *) allocate_array( size, sizeof( Char ) ) - -#define reallocate_character_array(array,size) \ - (Char *) reallocate_array( (void *) array, size, sizeof( Char ) ) - - -/* used to communicate between scanner and parser. The type should really - * be YYSTYPE, but we can't easily get our hands on it. - */ -extern int yylval; - - -/* external functions that are cross-referenced among the flex source files */ - - -/* from file ccl.c */ - -extern void ccladd PROTO((int, int)); /* Add a single character to a ccl */ -extern int cclinit PROTO(()); /* make an empty ccl */ -extern void cclnegate PROTO((int)); /* negate a ccl */ - -/* list the members of a set of characters in CCL form */ -extern void list_character_set PROTO((FILE*, int[])); - - -/* from file dfa.c */ - -/* increase the maximum number of dfas */ -extern void increase_max_dfas PROTO(()); - -extern void ntod PROTO(()); /* convert a ndfa to a dfa */ - - -/* from file ecs.c */ - -/* convert character classes to set of equivalence classes */ -extern void ccl2ecl PROTO(()); - -/* associate equivalence class numbers with class members */ -extern int cre8ecs PROTO((int[], int[], int)); - -/* associate equivalence class numbers using %t table */ -extern int ecs_from_xlation PROTO((int[])); - -/* update equivalence classes based on character class transitions */ -extern void mkeccl PROTO((Char[], int, int[], int[], int, int)); - -/* create equivalence class for single character */ -extern void mkechar PROTO((int, int[], int[])); - - -/* from file gen.c */ - -extern void make_tables PROTO(()); /* generate transition tables */ - - -/* from file main.c */ - -extern void flexend PROTO((int)); - - -/* from file misc.c */ - -/* write out the actions from the temporary file to lex.yy.c */ -extern void action_out PROTO(()); - -/* true if a string is all lower case */ -extern int all_lower PROTO((register Char *)); - -/* true if a string is all upper case */ -extern int all_upper PROTO((register Char *)); - -/* bubble sort an integer array */ -extern void bubble PROTO((int [], int)); - -/* shell sort a character array */ -extern void cshell PROTO((Char [], int, int)); - -extern void dataend PROTO(()); /* finish up a block of data declarations */ - -/* report an error message and terminate */ -extern void flexerror PROTO((char[])); - -/* report a fatal error message and terminate */ -extern void flexfatal PROTO((char[])); - -/* report an error message formatted with one integer argument */ -extern void lerrif PROTO((char[], int)); - -/* report an error message formatted with one string argument */ -extern void lerrsf PROTO((char[], char[])); - -/* spit out a "# line" statement */ -extern void line_directive_out PROTO((FILE*)); - -/* generate a data statment for a two-dimensional array */ -extern void mk2data PROTO((int)); - -extern void mkdata PROTO((int)); /* generate a data statement */ - -/* return the integer represented by a string of digits */ -extern int myctoi PROTO((Char [])); - -/* write out one section of the skeleton file */ -extern void skelout PROTO(()); - -/* output a yy_trans_info structure */ -extern void transition_struct_out PROTO((int, int)); - - -/* from file nfa.c */ - -/* add an accepting state to a machine */ -extern void add_accept PROTO((int, int)); - -/* make a given number of copies of a singleton machine */ -extern int copysingl PROTO((int, int)); - -/* debugging routine to write out an nfa */ -extern void dumpnfa PROTO((int)); - -/* finish up the processing for a rule */ -extern void finish_rule PROTO((int, int, int, int)); - -/* connect two machines together */ -extern int link_machines PROTO((int, int)); - -/* mark each "beginning" state in a machine as being a "normal" (i.e., - * not trailing context associated) state - */ -extern void mark_beginning_as_normal PROTO((register int)); - -/* make a machine that branches to two machines */ -extern int mkbranch PROTO((int, int)); - -extern int mkclos PROTO((int)); /* convert a machine into a closure */ -extern int mkopt PROTO((int)); /* make a machine optional */ - -/* make a machine that matches either one of two machines */ -extern int mkor PROTO((int, int)); - -/* convert a machine into a positive closure */ -extern int mkposcl PROTO((int)); - -extern int mkrep PROTO((int, int, int)); /* make a replicated machine */ - -/* create a state with a transition on a given symbol */ -extern int mkstate PROTO((int)); - -extern void new_rule PROTO(()); /* initialize for a new rule */ - - -/* from file parse.y */ - -/* write out a message formatted with one string, pinpointing its location */ -extern void format_pinpoint_message PROTO((char[], char[])); - -/* write out a message, pinpointing its location */ -extern void pinpoint_message PROTO((char[])); - -extern void synerr PROTO((char [])); /* report a syntax error */ -extern int yyparse PROTO(()); /* the YACC parser */ - - -/* from file scan.l */ - -extern int flexscan PROTO(()); /* the Flex-generated scanner for flex */ - -/* open the given file (if NULL, stdin) for scanning */ -extern void set_input_file PROTO((char*)); - -extern int yywrap PROTO(()); /* wrapup a file in the lexical analyzer */ - - -/* from file sym.c */ - -/* save the text of a character class */ -extern void cclinstal PROTO ((Char [], int)); - -/* lookup the number associated with character class */ -extern int ccllookup PROTO((Char [])); - -extern void ndinstal PROTO((char[], Char[])); /* install a name definition */ -extern void scinstal PROTO((char[], int)); /* make a start condition */ - -/* lookup the number associated with a start condition */ -extern int sclookup PROTO((char[])); - - -/* from file tblcmp.c */ - -/* build table entries for dfa state */ -extern void bldtbl PROTO((int[], int, int, int, int)); - -extern void cmptmps PROTO(()); /* compress template table entries */ -extern void inittbl PROTO(()); /* initialize transition tables */ -extern void mkdeftbl PROTO(()); /* make the default, "jam" table entries */ - -/* create table entries for a state (or state fragment) which has - * only one out-transition */ -extern void mk1tbl PROTO((int, int, int, int)); - -/* place a state into full speed transition table */ -extern void place_state PROTO((int*, int, int)); - -/* save states with only one out-transition to be processed later */ -extern void stack1 PROTO((int, int, int, int)); - - -/* from file yylex.c */ - -extern int yylex PROTO(()); - - -/* The Unix kernel calls used here */ - -extern int read PROTO((int, char*, int)); -extern int unlink PROTO((char*)); -extern int write PROTO((int, char*, int)); diff --git a/util/flex/flexdoc.1 b/util/flex/flexdoc.1 deleted file mode 100644 index cef3d7d85..000000000 --- a/util/flex/flexdoc.1 +++ /dev/null @@ -1,2446 +0,0 @@ -.TH FLEX 1 "26 May 1990" "Version 2.3" -.SH NAME -flex - fast lexical analyzer generator -.SH SYNOPSIS -.B flex -.B [-bcdfinpstvFILT8 -C[efmF] -Sskeleton] -.I [filename ...] -.SH DESCRIPTION -.I flex -is a tool for generating -.I scanners: -programs which recognized lexical patterns in text. -.I flex -reads -the given input files, or its standard input if no file names are given, -for a description of a scanner to generate. The description is in -the form of pairs -of regular expressions and C code, called -.I rules. flex -generates as output a C source file, -.B lex.yy.c, -which defines a routine -.B yylex(). -This file is compiled and linked with the -.B -lfl -library to produce an executable. When the executable is run, -it analyzes its input for occurrences -of the regular expressions. Whenever it finds one, it executes -the corresponding C code. -.SH SOME SIMPLE EXAMPLES -.LP -First some simple examples to get the flavor of how one uses -.I flex. -The following -.I flex -input specifies a scanner which whenever it encounters the string -"username" will replace it with the user's login name: -.nf - - %% - username printf( "%s", getlogin() ); - -.fi -By default, any text not matched by a -.I flex -scanner -is copied to the output, so the net effect of this scanner is -to copy its input file to its output with each occurrence -of "username" expanded. -In this input, there is just one rule. "username" is the -.I pattern -and the "printf" is the -.I action. -The "%%" marks the beginning of the rules. -.LP -Here's another simple example: -.nf - - int num_lines = 0, num_chars = 0; - - %% - \\n ++num_lines; ++num_chars; - . ++num_chars; - - %% - main() - { - yylex(); - printf( "# of lines = %d, # of chars = %d\\n", - num_lines, num_chars ); - } - -.fi -This scanner counts the number of characters and the number -of lines in its input (it produces no output other than the -final report on the counts). The first line -declares two globals, "num_lines" and "num_chars", which are accessible -both inside -.B yylex() -and in the -.B main() -routine declared after the second "%%". There are two rules, one -which matches a newline ("\\n") and increments both the line count and -the character count, and one which matches any character other than -a newline (indicated by the "." regular expression). -.LP -A somewhat more complicated example: -.nf - - /* scanner for a toy Pascal-like language */ - - %{ - /* need this for the call to atof() below */ - #include - %} - - DIGIT [0-9] - ID [a-z][a-z0-9]* - - %% - - {DIGIT}+ { - printf( "An integer: %s (%d)\\n", yytext, - atoi( yytext ) ); - } - - {DIGIT}+"."{DIGIT}* { - printf( "A float: %s (%g)\\n", yytext, - atof( yytext ) ); - } - - if|then|begin|end|procedure|function { - printf( "A keyword: %s\\n", yytext ); - } - - {ID} printf( "An identifier: %s\\n", yytext ); - - "+"|"-"|"*"|"/" printf( "An operator: %s\\n", yytext ); - - "{"[^}\\n]*"}" /* eat up one-line comments */ - - [ \\t\\n]+ /* eat up whitespace */ - - . printf( "Unrecognized character: %s\\n", yytext ); - - %% - - main( argc, argv ) - int argc; - char **argv; - { - ++argv, --argc; /* skip over program name */ - if ( argc > 0 ) - yyin = fopen( argv[0], "r" ); - else - yyin = stdin; - - yylex(); - } - -.fi -This is the beginnings of a simple scanner for a language like -Pascal. It identifies different types of -.I tokens -and reports on what it has seen. -.LP -The details of this example will be explained in the following -sections. -.SH FORMAT OF THE INPUT FILE -The -.I flex -input file consists of three sections, separated by a line with just -.B %% -in it: -.nf - - definitions - %% - rules - %% - user code - -.fi -The -.I definitions -section contains declarations of simple -.I name -definitions to simplify the scanner specification, and declarations of -.I start conditions, -which are explained in a later section. -.LP -Name definitions have the form: -.nf - - name definition - -.fi -The "name" is a word beginning with a letter or an underscore ('_') -followed by zero or more letters, digits, '_', or '-' (dash). -The definition is taken to begin at the first non-white-space character -following the name and continuing to the end of the line. -The definition can subsequently be referred to using "{name}", which -will expand to "(definition)". For example, -.nf - - DIGIT [0-9] - ID [a-z][a-z0-9]* - -.fi -defines "DIGIT" to be a regular expression which matches a -single digit, and -"ID" to be a regular expression which matches a letter -followed by zero-or-more letters-or-digits. -A subsequent reference to -.nf - - {DIGIT}+"."{DIGIT}* - -.fi -is identical to -.nf - - ([0-9])+"."([0-9])* - -.fi -and matches one-or-more digits followed by a '.' followed -by zero-or-more digits. -.LP -The -.I rules -section of the -.I flex -input contains a series of rules of the form: -.nf - - pattern action - -.fi -where the pattern must be unindented and the action must begin -on the same line. -.LP -See below for a further description of patterns and actions. -.LP -Finally, the user code section is simply copied to -.B lex.yy.c -verbatim. -It is used for companion routines which call or are called -by the scanner. The presence of this section is optional; -if it is missing, the second -.B %% -in the input file may be skipped, too. -.LP -In the definitions and rules sections, any -.I indented -text or text enclosed in -.B %{ -and -.B %} -is copied verbatim to the output (with the %{}'s removed). -The %{}'s must appear unindented on lines by themselves. -.LP -In the rules section, -any indented or %{} text appearing before the -first rule may be used to declare variables -which are local to the scanning routine and (after the declarations) -code which is to be executed whenever the scanning routine is entered. -Other indented or %{} text in the rule section is still copied to the output, -but its meaning is not well-defined and it may well cause compile-time -errors (this feature is present for -.I POSIX -compliance; see below for other such features). -.LP -In the definitions section, an unindented comment (i.e., a line -beginning with "/*") is also copied verbatim to the output up -to the next "*/". Also, any line in the definitions section -beginning with '#' is ignored, though this style of comment is -deprecated and may go away in the future. -.SH PATTERNS -The patterns in the input are written using an extended set of regular -expressions. These are: -.nf - - x match the character 'x' - . any character except newline - [xyz] a "character class"; in this case, the pattern - matches either an 'x', a 'y', or a 'z' - [abj-oZ] a "character class" with a range in it; matches - an 'a', a 'b', any letter from 'j' through 'o', - or a 'Z' - [^A-Z] a "negated character class", i.e., any character - but those in the class. In this case, any - character EXCEPT an uppercase letter. - [^A-Z\\n] any character EXCEPT an uppercase letter or - a newline - r* zero or more r's, where r is any regular expression - r+ one or more r's - r? zero or one r's (that is, "an optional r") - r{2,5} anywhere from two to five r's - r{2,} two or more r's - r{4} exactly 4 r's - {name} the expansion of the "name" definition - (see above) - "[xyz]\\"foo" - the literal string: [xyz]"foo - \\X if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v', - then the ANSI-C interpretation of \\x. - Otherwise, a literal 'X' (used to escape - operators such as '*') - \\123 the character with octal value 123 - \\x2a the character with hexadecimal value 2a - (r) match an r; parentheses are used to override - precedence (see below) - - - rs the regular expression r followed by the - regular expression s; called "concatenation" - - - r|s either an r or an s - - - r/s an r but only if it is followed by an s. The - s is not part of the matched text. This type - of pattern is called as "trailing context". - ^r an r, but only at the beginning of a line - r$ an r, but only at the end of a line. Equivalent - to "r/\\n". - - - r an r, but only in start condition s (see - below for discussion of start conditions) - r - same, but in any of start conditions s1, - s2, or s3 - - - <> an end-of-file - <> - an end-of-file when in start condition s1 or s2 - -.fi -The regular expressions listed above are grouped according to -precedence, from highest precedence at the top to lowest at the bottom. -Those grouped together have equal precedence. For example, -.nf - - foo|bar* - -.fi -is the same as -.nf - - (foo)|(ba(r*)) - -.fi -since the '*' operator has higher precedence than concatenation, -and concatenation higher than alternation ('|'). This pattern -therefore matches -.I either -the string "foo" -.I or -the string "ba" followed by zero-or-more r's. -To match "foo" or zero-or-more "bar"'s, use: -.nf - - foo|(bar)* - -.fi -and to match zero-or-more "foo"'s-or-"bar"'s: -.nf - - (foo|bar)* - -.fi -.LP -Some notes on patterns: -.IP - -A negated character class such as the example "[^A-Z]" -above -.I will match a newline -unless "\\n" (or an equivalent escape sequence) is one of the -characters explicitly present in the negated character class -(e.g., "[^A-Z\\n]"). This is unlike how many other regular -expression tools treat negated character classes, but unfortunately -the inconsistency is historically entrenched. -Matching newlines means that a pattern like [^"]* can match an entire -input (overflowing the scanner's input buffer) unless there's another -quote in the input. -.IP - -A rule can have at most one instance of trailing context (the '/' operator -or the '$' operator). The start condition, '^', and "<>" patterns -can only occur at the beginning of a pattern, and, as well as with '/' and '$', -cannot be grouped inside parentheses. A '^' which does not occur at -the beginning of a rule or a '$' which does not occur at the end of -a rule loses its special properties and is treated as a normal character. -.IP -The following are illegal: -.nf - - foo/bar$ - foobar - -.fi -Note that the first of these, can be written "foo/bar\\n". -.IP -The following will result in '$' or '^' being treated as a normal character: -.nf - - foo|(bar$) - foo|^bar - -.fi -If what's wanted is a "foo" or a bar-followed-by-a-newline, the following -could be used (the special '|' action is explained below): -.nf - - foo | - bar$ /* action goes here */ - -.fi -A similar trick will work for matching a foo or a -bar-at-the-beginning-of-a-line. -.SH HOW THE INPUT IS MATCHED -When the generated scanner is run, it analyzes its input looking -for strings which match any of its patterns. If it finds more than -one match, it takes the one matching the most text (for trailing -context rules, this includes the length of the trailing part, even -though it will then be returned to the input). If it finds two -or more matches of the same length, the -rule listed first in the -.I flex -input file is chosen. -.LP -Once the match is determined, the text corresponding to the match -(called the -.I token) -is made available in the global character pointer -.B yytext, -and its length in the global integer -.B yyleng. -The -.I action -corresponding to the matched pattern is then executed (a more -detailed description of actions follows), and then the remaining -input is scanned for another match. -.LP -If no match is found, then the -.I default rule -is executed: the next character in the input is considered matched and -copied to the standard output. Thus, the simplest legal -.I flex -input is: -.nf - - %% - -.fi -which generates a scanner that simply copies its input (one character -at a time) to its output. -.SH ACTIONS -Each pattern in a rule has a corresponding action, which can be any -arbitrary C statement. The pattern ends at the first non-escaped -whitespace character; the remainder of the line is its action. If the -action is empty, then when the pattern is matched the input token -is simply discarded. For example, here is the specification for a program -which deletes all occurrences of "zap me" from its input: -.nf - - %% - "zap me" - -.fi -(It will copy all other characters in the input to the output since -they will be matched by the default rule.) -.LP -Here is a program which compresses multiple blanks and tabs down to -a single blank, and throws away whitespace found at the end of a line: -.nf - - %% - [ \\t]+ putchar( ' ' ); - [ \\t]+$ /* ignore this token */ - -.fi -.LP -If the action contains a '{', then the action spans till the balancing '}' -is found, and the action may cross multiple lines. -.I flex -knows about C strings and comments and won't be fooled by braces found -within them, but also allows actions to begin with -.B %{ -and will consider the action to be all the text up to the next -.B %} -(regardless of ordinary braces inside the action). -.LP -An action consisting solely of a vertical bar ('|') means "same as -the action for the next rule." See below for an illustration. -.LP -Actions can include arbitrary C code, including -.B return -statements to return a value to whatever routine called -.B yylex(). -Each time -.B yylex() -is called it continues processing tokens from where it last left -off until it either reaches -the end of the file or executes a return. Once it reaches an end-of-file, -however, then any subsequent call to -.B yylex() -will simply immediately return, unless -.B yyrestart() -is first called (see below). -.LP -Actions are not allowed to modify yytext or yyleng. -.LP -There are a number of special directives which can be included within -an action: -.IP - -.B ECHO -copies yytext to the scanner's output. -.IP - -.B BEGIN -followed by the name of a start condition places the scanner in the -corresponding start condition (see below). -.IP - -.B REJECT -directs the scanner to proceed on to the "second best" rule which matched the -input (or a prefix of the input). The rule is chosen as described -above in "How the Input is Matched", and -.B yytext -and -.B yyleng -set up appropriately. -It may either be one which matched as much text -as the originally chosen rule but came later in the -.I flex -input file, or one which matched less text. -For example, the following will both count the -words in the input and call the routine special() whenever "frob" is seen: -.nf - - int word_count = 0; - %% - - frob special(); REJECT; - [^ \\t\\n]+ ++word_count; - -.fi -Without the -.B REJECT, -any "frob"'s in the input would not be counted as words, since the -scanner normally executes only one action per token. -Multiple -.B REJECT's -are allowed, each one finding the next best choice to the currently -active rule. For example, when the following scanner scans the token -"abcd", it will write "abcdabcaba" to the output: -.nf - - %% - a | - ab | - abc | - abcd ECHO; REJECT; - .|\\n /* eat up any unmatched character */ - -.fi -(The first three rules share the fourth's action since they use -the special '|' action.) -.B REJECT -is a particularly expensive feature in terms scanner performance; -if it is used in -.I any -of the scanner's actions it will slow down -.I all -of the scanner's matching. Furthermore, -.B REJECT -cannot be used with the -.I -f -or -.I -F -options (see below). -.IP -Note also that unlike the other special actions, -.B REJECT -is a -.I branch; -code immediately following it in the action will -.I not -be executed. -.IP - -.B yymore() -tells the scanner that the next time it matches a rule, the corresponding -token should be -.I appended -onto the current value of -.B yytext -rather than replacing it. For example, given the input "mega-kludge" -the following will write "mega-mega-kludge" to the output: -.nf - - %% - mega- ECHO; yymore(); - kludge ECHO; - -.fi -First "mega-" is matched and echoed to the output. Then "kludge" -is matched, but the previous "mega-" is still hanging around at the -beginning of -.B yytext -so the -.B ECHO -for the "kludge" rule will actually write "mega-kludge". -The presence of -.B yymore() -in the scanner's action entails a minor performance penalty in the -scanner's matching speed. -.IP - -.B yyless(n) -returns all but the first -.I n -characters of the current token back to the input stream, where they -will be rescanned when the scanner looks for the next match. -.B yytext -and -.B yyleng -are adjusted appropriately (e.g., -.B yyleng -will now be equal to -.I n -). For example, on the input "foobar" the following will write out -"foobarbar": -.nf - - %% - foobar ECHO; yyless(3); - [a-z]+ ECHO; - -.fi -An argument of 0 to -.B yyless -will cause the entire current input string to be scanned again. Unless you've -changed how the scanner will subsequently process its input (using -.B BEGIN, -for example), this will result in an endless loop. -.IP - -.B unput(c) -puts the character -.I c -back onto the input stream. It will be the next character scanned. -The following action will take the current token and cause it -to be rescanned enclosed in parentheses. -.nf - - { - int i; - unput( ')' ); - for ( i = yyleng - 1; i >= 0; --i ) - unput( yytext[i] ); - unput( '(' ); - } - -.fi -Note that since each -.B unput() -puts the given character back at the -.I beginning -of the input stream, pushing back strings must be done back-to-front. -.IP - -.B input() -reads the next character from the input stream. For example, -the following is one way to eat up C comments: -.nf - - %% - "/*" { - register int c; - - for ( ; ; ) - { - while ( (c = input()) != '*' && - c != EOF ) - ; /* eat up text of comment */ - - if ( c == '*' ) - { - while ( (c = input()) == '*' ) - ; - if ( c == '/' ) - break; /* found the end */ - } - - if ( c == EOF ) - { - error( "EOF in comment" ); - break; - } - } - } - -.fi -(Note that if the scanner is compiled using -.B C++, -then -.B input() -is instead referred to as -.B yyinput(), -in order to avoid a name clash with the -.B C++ -stream by the name of -.I input.) -.IP - -.B yyterminate() -can be used in lieu of a return statement in an action. It terminates -the scanner and returns a 0 to the scanner's caller, indicating "all done". -Subsequent calls to the scanner will immediately return unless preceded -by a call to -.B yyrestart() -(see below). -By default, -.B yyterminate() -is also called when an end-of-file is encountered. It is a macro and -may be redefined. -.SH THE GENERATED SCANNER -The output of -.I flex -is the file -.B lex.yy.c, -which contains the scanning routine -.B yylex(), -a number of tables used by it for matching tokens, and a number -of auxiliary routines and macros. By default, -.B yylex() -is declared as follows: -.nf - - int yylex() - { - ... various definitions and the actions in here ... - } - -.fi -(If your environment supports function prototypes, then it will -be "int yylex( void )".) This definition may be changed by redefining -the "YY_DECL" macro. For example, you could use: -.nf - - #undef YY_DECL - #define YY_DECL float lexscan( a, b ) float a, b; - -.fi -to give the scanning routine the name -.I lexscan, -returning a float, and taking two floats as arguments. Note that -if you give arguments to the scanning routine using a -K&R-style/non-prototyped function declaration, you must terminate -the definition with a semi-colon (;). -.LP -Whenever -.B yylex() -is called, it scans tokens from the global input file -.I yyin -(which defaults to stdin). It continues until it either reaches -an end-of-file (at which point it returns the value 0) or -one of its actions executes a -.I return -statement. -In the former case, when called again the scanner will immediately -return unless -.B yyrestart() -is called to point -.I yyin -at the new input file. ( -.B yyrestart() -takes one argument, a -.B FILE * -pointer.) -In the latter case (i.e., when an action -executes a return), the scanner may then be called again and it -will resume scanning where it left off. -.LP -By default (and for purposes of efficiency), the scanner uses -block-reads rather than simple -.I getc() -calls to read characters from -.I yyin. -The nature of how it gets its input can be controlled by redefining the -.B YY_INPUT -macro. -YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)". Its -action is to place up to -.I max_size -characters in the character array -.I buf -and return in the integer variable -.I result -either the -number of characters read or the constant YY_NULL (0 on Unix systems) -to indicate EOF. The default YY_INPUT reads from the -global file-pointer "yyin". -.LP -A sample redefinition of YY_INPUT (in the definitions -section of the input file): -.nf - - %{ - #undef YY_INPUT - #define YY_INPUT(buf,result,max_size) \\ - { \\ - int c = getchar(); \\ - result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\ - } - %} - -.fi -This definition will change the input processing to occur -one character at a time. -.LP -You also can add in things like keeping track of the -input line number this way; but don't expect your scanner to -go very fast. -.LP -When the scanner receives an end-of-file indication from YY_INPUT, -it then checks the -.B yywrap() -function. If -.B yywrap() -returns false (zero), then it is assumed that the -function has gone ahead and set up -.I yyin -to point to another input file, and scanning continues. If it returns -true (non-zero), then the scanner terminates, returning 0 to its -caller. -.LP -The default -.B yywrap() -always returns 1. Presently, to redefine it you must first -"#undef yywrap", as it is currently implemented as a macro. As indicated -by the hedging in the previous sentence, it may be changed to -a true function in the near future. -.LP -The scanner writes its -.B ECHO -output to the -.I yyout -global (default, stdout), which may be redefined by the user simply -by assigning it to some other -.B FILE -pointer. -.SH START CONDITIONS -.I flex -provides a mechanism for conditionally activating rules. Any rule -whose pattern is prefixed with "" will only be active when -the scanner is in the start condition named "sc". For example, -.nf - - [^"]* { /* eat up the string body ... */ - ... - } - -.fi -will be active only when the scanner is in the "STRING" start -condition, and -.nf - - \\. { /* handle an escape ... */ - ... - } - -.fi -will be active only when the current start condition is -either "INITIAL", "STRING", or "QUOTE". -.LP -Start conditions -are declared in the definitions (first) section of the input -using unindented lines beginning with either -.B %s -or -.B %x -followed by a list of names. -The former declares -.I inclusive -start conditions, the latter -.I exclusive -start conditions. A start condition is activated using the -.B BEGIN -action. Until the next -.B BEGIN -action is executed, rules with the given start -condition will be active and -rules with other start conditions will be inactive. -If the start condition is -.I inclusive, -then rules with no start conditions at all will also be active. -If it is -.I exclusive, -then -.I only -rules qualified with the start condition will be active. -A set of rules contingent on the same exclusive start condition -describe a scanner which is independent of any of the other rules in the -.I flex -input. Because of this, -exclusive start conditions make it easy to specify "mini-scanners" -which scan portions of the input that are syntactically different -from the rest (e.g., comments). -.LP -If the distinction between inclusive and exclusive start conditions -is still a little vague, here's a simple example illustrating the -connection between the two. The set of rules: -.nf - - %s example - %% - foo /* do something */ - -.fi -is equivalent to -.nf - - %x example - %% - foo /* do something */ - -.fi -.LP -The default rule (to -.B ECHO -any unmatched character) remains active in start conditions. -.LP -.B BEGIN(0) -returns to the original state where only the rules with -no start conditions are active. This state can also be -referred to as the start-condition "INITIAL", so -.B BEGIN(INITIAL) -is equivalent to -.B BEGIN(0). -(The parentheses around the start condition name are not required but -are considered good style.) -.LP -.B BEGIN -actions can also be given as indented code at the beginning -of the rules section. For example, the following will cause -the scanner to enter the "SPECIAL" start condition whenever -.I yylex() -is called and the global variable -.I enter_special -is true: -.nf - - int enter_special; - - %x SPECIAL - %% - if ( enter_special ) - BEGIN(SPECIAL); - - blahblahblah - ...more rules follow... - -.fi -.LP -To illustrate the uses of start conditions, -here is a scanner which provides two different interpretations -of a string like "123.456". By default it will treat it as -as three tokens, the integer "123", a dot ('.'), and the integer "456". -But if the string is preceded earlier in the line by the string -"expect-floats" -it will treat it as a single token, the floating-point number -123.456: -.nf - - %{ - #include - %} - %s expect - - %% - expect-floats BEGIN(expect); - - [0-9]+"."[0-9]+ { - printf( "found a float, = %f\\n", - atof( yytext ) ); - } - \\n { - /* that's the end of the line, so - * we need another "expect-number" - * before we'll recognize any more - * numbers - */ - BEGIN(INITIAL); - } - - [0-9]+ { - printf( "found an integer, = %d\\n", - atoi( yytext ) ); - } - - "." printf( "found a dot\\n" ); - -.fi -Here is a scanner which recognizes (and discards) C comments while -maintaining a count of the current input line. -.nf - - %x comment - %% - int line_num = 1; - - "/*" BEGIN(comment); - - [^*\\n]* /* eat anything that's not a '*' */ - "*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ - \\n ++line_num; - "*"+"/" BEGIN(INITIAL); - -.fi -Note that start-conditions names are really integer values and -can be stored as such. Thus, the above could be extended in the -following fashion: -.nf - - %x comment foo - %% - int line_num = 1; - int comment_caller; - - "/*" { - comment_caller = INITIAL; - BEGIN(comment); - } - - ... - - "/*" { - comment_caller = foo; - BEGIN(comment); - } - - [^*\\n]* /* eat anything that's not a '*' */ - "*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ - \\n ++line_num; - "*"+"/" BEGIN(comment_caller); - -.fi -One can then implement a "stack" of start conditions using an -array of integers. (It is likely that such stacks will become -a full-fledged -.I flex -feature in the future.) Note, though, that -start conditions do not have their own name-space; %s's and %x's -declare names in the same fashion as #define's. -.SH MULTIPLE INPUT BUFFERS -Some scanners (such as those which support "include" files) -require reading from several input streams. As -.I flex -scanners do a large amount of buffering, one cannot control -where the next input will be read from by simply writing a -.B YY_INPUT -which is sensitive to the scanning context. -.B YY_INPUT -is only called when the scanner reaches the end of its buffer, which -may be a long time after scanning a statement such as an "include" -which requires switching the input source. -.LP -To negotiate these sorts of problems, -.I flex -provides a mechanism for creating and switching between multiple -input buffers. An input buffer is created by using: -.nf - - YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) - -.fi -which takes a -.I FILE -pointer and a size and creates a buffer associated with the given -file and large enough to hold -.I size -characters (when in doubt, use -.B YY_BUF_SIZE -for the size). It returns a -.B YY_BUFFER_STATE -handle, which may then be passed to other routines: -.nf - - void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) - -.fi -switches the scanner's input buffer so subsequent tokens will -come from -.I new_buffer. -Note that -.B yy_switch_to_buffer() -may be used by yywrap() to sets things up for continued scanning, instead -of opening a new file and pointing -.I yyin -at it. -.nf - - void yy_delete_buffer( YY_BUFFER_STATE buffer ) - -.fi -is used to reclaim the storage associated with a buffer. -.LP -.B yy_new_buffer() -is an alias for -.B yy_create_buffer(), -provided for compatibility with the C++ use of -.I new -and -.I delete -for creating and destroying dynamic objects. -.LP -Finally, the -.B YY_CURRENT_BUFFER -macro returns a -.B YY_BUFFER_STATE -handle to the current buffer. -.LP -Here is an example of using these features for writing a scanner -which expands include files (the -.B <> -feature is discussed below): -.nf - - /* the "incl" state is used for picking up the name - * of an include file - */ - %x incl - - %{ - #define MAX_INCLUDE_DEPTH 10 - YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; - int include_stack_ptr = 0; - %} - - %% - include BEGIN(incl); - - [a-z]+ ECHO; - [^a-z\\n]*\\n? ECHO; - - [ \\t]* /* eat the whitespace */ - [^ \\t\\n]+ { /* got the include file name */ - if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) - { - fprintf( stderr, "Includes nested too deeply" ); - exit( 1 ); - } - - include_stack[include_stack_ptr++] = - YY_CURRENT_BUFFER; - - yyin = fopen( yytext, "r" ); - - if ( ! yyin ) - error( ... ); - - yy_switch_to_buffer( - yy_create_buffer( yyin, YY_BUF_SIZE ) ); - - BEGIN(INITIAL); - } - - <> { - if ( --include_stack_ptr < 0 ) - { - yyterminate(); - } - - else - yy_switch_to_buffer( - include_stack[include_stack_ptr] ); - } - -.fi -.SH END-OF-FILE RULES -The special rule "<>" indicates -actions which are to be taken when an end-of-file is -encountered and yywrap() returns non-zero (i.e., indicates -no further files to process). The action must finish -by doing one of four things: -.IP - -the special -.B YY_NEW_FILE -action, if -.I yyin -has been pointed at a new file to process; -.IP - -a -.I return -statement; -.IP - -the special -.B yyterminate() -action; -.IP - -or, switching to a new buffer using -.B yy_switch_to_buffer() -as shown in the example above. -.LP -<> rules may not be used with other -patterns; they may only be qualified with a list of start -conditions. If an unqualified <> rule is given, it -applies to -.I all -start conditions which do not already have <> actions. To -specify an <> rule for only the initial start condition, use -.nf - - <> - -.fi -.LP -These rules are useful for catching things like unclosed comments. -An example: -.nf - - %x quote - %% - - ...other rules for dealing with quotes... - - <> { - error( "unterminated quote" ); - yyterminate(); - } - <> { - if ( *++filelist ) - { - yyin = fopen( *filelist, "r" ); - YY_NEW_FILE; - } - else - yyterminate(); - } - -.fi -.SH MISCELLANEOUS MACROS -The macro -.bd -YY_USER_ACTION -can be redefined to provide an action -which is always executed prior to the matched rule's action. For example, -it could be #define'd to call a routine to convert yytext to lower-case. -.LP -The macro -.B YY_USER_INIT -may be redefined to provide an action which is always executed before -the first scan (and before the scanner's internal initializations are done). -For example, it could be used to call a routine to read -in a data table or open a logging file. -.LP -In the generated scanner, the actions are all gathered in one large -switch statement and separated using -.B YY_BREAK, -which may be redefined. By default, it is simply a "break", to separate -each rule's action from the following rule's. -Redefining -.B YY_BREAK -allows, for example, C++ users to -#define YY_BREAK to do nothing (while being very careful that every -rule ends with a "break" or a "return"!) to avoid suffering from -unreachable statement warnings where because a rule's action ends with -"return", the -.B YY_BREAK -is inaccessible. -.SH INTERFACING WITH YACC -One of the main uses of -.I flex -is as a companion to the -.I yacc -parser-generator. -.I yacc -parsers expect to call a routine named -.B yylex() -to find the next input token. The routine is supposed to -return the type of the next token as well as putting any associated -value in the global -.B yylval. -To use -.I flex -with -.I yacc, -one specifies the -.B -d -option to -.I yacc -to instruct it to generate the file -.B y.tab.h -containing definitions of all the -.B %tokens -appearing in the -.I yacc -input. This file is then included in the -.I flex -scanner. For example, if one of the tokens is "TOK_NUMBER", -part of the scanner might look like: -.nf - - %{ - #include "y.tab.h" - %} - - %% - - [0-9]+ yylval = atoi( yytext ); return TOK_NUMBER; - -.fi -.SH TRANSLATION TABLE -In the name of POSIX compliance, -.I flex -supports a -.I translation table -for mapping input characters into groups. -The table is specified in the first section, and its format looks like: -.nf - - %t - 1 abcd - 2 ABCDEFGHIJKLMNOPQRSTUVWXYZ - 52 0123456789 - 6 \\t\\ \\n - %t - -.fi -This example specifies that the characters 'a', 'b', 'c', and 'd' -are to all be lumped into group #1, upper-case letters -in group #2, digits in group #52, tabs, blanks, and newlines into -group #6, and -.I -no other characters will appear in the patterns. -The group numbers are actually disregarded by -.I flex; -.B %t -serves, though, to lump characters together. Given the above -table, for example, the pattern "a(AA)*5" is equivalent to "d(ZQ)*0". -They both say, "match any character in group #1, followed by -zero-or-more pairs of characters -from group #2, followed by a character from group #52." Thus -.B %t -provides a crude way for introducing equivalence classes into -the scanner specification. -.LP -Note that the -.B -i -option (see below) coupled with the equivalence classes which -.I flex -automatically generates take care of virtually all the instances -when one might consider using -.B %t. -But what the hell, it's there if you want it. -.SH OPTIONS -.I flex -has the following options: -.TP -.B -b -Generate backtracking information to -.I lex.backtrack. -This is a list of scanner states which require backtracking -and the input characters on which they do so. By adding rules one -can remove backtracking states. If all backtracking states -are eliminated and -.B -f -or -.B -F -is used, the generated scanner will run faster (see the -.B -p -flag). Only users who wish to squeeze every last cycle out of their -scanners need worry about this option. (See the section on PERFORMANCE -CONSIDERATIONS below.) -.TP -.B -c -is a do-nothing, deprecated option included for POSIX compliance. -.IP -.B NOTE: -in previous releases of -.I flex -.B -c -specified table-compression options. This functionality is -now given by the -.B -C -flag. To ease the the impact of this change, when -.I flex -encounters -.B -c, -it currently issues a warning message and assumes that -.B -C -was desired instead. In the future this "promotion" of -.B -c -to -.B -C -will go away in the name of full POSIX compliance (unless -the POSIX meaning is removed first). -.TP -.B -d -makes the generated scanner run in -.I debug -mode. Whenever a pattern is recognized and the global -.B yy_flex_debug -is non-zero (which is the default), -the scanner will write to -.I stderr -a line of the form: -.nf - - --accepting rule at line 53 ("the matched text") - -.fi -The line number refers to the location of the rule in the file -defining the scanner (i.e., the file that was fed to flex). Messages -are also generated when the scanner backtracks, accepts the -default rule, reaches the end of its input buffer (or encounters -a NUL; at this point, the two look the same as far as the scanner's concerned), -or reaches an end-of-file. -.TP -.B -f -specifies (take your pick) -.I full table -or -.I fast scanner. -No table compression is done. The result is large but fast. -This option is equivalent to -.B -Cf -(see below). -.TP -.B -i -instructs -.I flex -to generate a -.I case-insensitive -scanner. The case of letters given in the -.I flex -input patterns will -be ignored, and tokens in the input will be matched regardless of case. The -matched text given in -.I yytext -will have the preserved case (i.e., it will not be folded). -.TP -.B -n -is another do-nothing, deprecated option included only for -POSIX compliance. -.TP -.B -p -generates a performance report to stderr. The report -consists of comments regarding features of the -.I flex -input file which will cause a loss of performance in the resulting scanner. -Note that the use of -.I REJECT -and variable trailing context (see the BUGS section in flex(1)) -entails a substantial performance penalty; use of -.I yymore(), -the -.B ^ -operator, -and the -.B -I -flag entail minor performance penalties. -.TP -.B -s -causes the -.I default rule -(that unmatched scanner input is echoed to -.I stdout) -to be suppressed. If the scanner encounters input that does not -match any of its rules, it aborts with an error. This option is -useful for finding holes in a scanner's rule set. -.TP -.B -t -instructs -.I flex -to write the scanner it generates to standard output instead -of -.B lex.yy.c. -.TP -.B -v -specifies that -.I flex -should write to -.I stderr -a summary of statistics regarding the scanner it generates. -Most of the statistics are meaningless to the casual -.I flex -user, but the -first line identifies the version of -.I flex, -which is useful for figuring -out where you stand with respect to patches and new releases, -and the next two lines give the date when the scanner was created -and a summary of the flags which were in effect. -.TP -.B -F -specifies that the -.ul -fast -scanner table representation should be used. This representation is -about as fast as the full table representation -.ul -(-f), -and for some sets of patterns will be considerably smaller (and for -others, larger). In general, if the pattern set contains both "keywords" -and a catch-all, "identifier" rule, such as in the set: -.nf - - "case" return TOK_CASE; - "switch" return TOK_SWITCH; - ... - "default" return TOK_DEFAULT; - [a-z]+ return TOK_ID; - -.fi -then you're better off using the full table representation. If only -the "identifier" rule is present and you then use a hash table or some such -to detect the keywords, you're better off using -.ul --F. -.IP -This option is equivalent to -.B -CF -(see below). -.TP -.B -I -instructs -.I flex -to generate an -.I interactive -scanner. Normally, scanners generated by -.I flex -always look ahead one -character before deciding that a rule has been matched. At the cost of -some scanning overhead, -.I flex -will generate a scanner which only looks ahead -when needed. Such scanners are called -.I interactive -because if you want to write a scanner for an interactive system such as a -command shell, you will probably want the user's input to be terminated -with a newline, and without -.B -I -the user will have to type a character in addition to the newline in order -to have the newline recognized. This leads to dreadful interactive -performance. -.IP -If all this seems to confusing, here's the general rule: if a human will -be typing in input to your scanner, use -.B -I, -otherwise don't; if you don't care about squeezing the utmost performance -from your scanner and you -don't want to make any assumptions about the input to your scanner, -use -.B -I. -.IP -Note, -.B -I -cannot be used in conjunction with -.I full -or -.I fast tables, -i.e., the -.B -f, -F, -Cf, -or -.B -CF -flags. -.TP -.B -L -instructs -.I flex -not to generate -.B #line -directives. Without this option, -.I flex -peppers the generated scanner -with #line directives so error messages in the actions will be correctly -located with respect to the original -.I flex -input file, and not to -the fairly meaningless line numbers of -.B lex.yy.c. -(Unfortunately -.I flex -does not presently generate the necessary directives -to "retarget" the line numbers for those parts of -.B lex.yy.c -which it generated. So if there is an error in the generated code, -a meaningless line number is reported.) -.TP -.B -T -makes -.I flex -run in -.I trace -mode. It will generate a lot of messages to -.I stdout -concerning -the form of the input and the resultant non-deterministic and deterministic -finite automata. This option is mostly for use in maintaining -.I flex. -.TP -.B -8 -instructs -.I flex -to generate an 8-bit scanner, i.e., one which can recognize 8-bit -characters. On some sites, -.I flex -is installed with this option as the default. On others, the default -is 7-bit characters. To see which is the case, check the verbose -.B (-v) -output for "equivalence classes created". If the denominator of -the number shown is 128, then by default -.I flex -is generating 7-bit characters. If it is 256, then the default is -8-bit characters and the -.B -8 -flag is not required (but may be a good idea to keep the scanner -specification portable). Feeding a 7-bit scanner 8-bit characters -will result in infinite loops, bus errors, or other such fireworks, -so when in doubt, use the flag. Note that if equivalence classes -are used, 8-bit scanners take only slightly more table space than -7-bit scanners (128 bytes, to be exact); if equivalence classes are -not used, however, then the tables may grow up to twice their -7-bit size. -.TP -.B -C[efmF] -controls the degree of table compression. -.IP -.B -Ce -directs -.I flex -to construct -.I equivalence classes, -i.e., sets of characters -which have identical lexical properties (for example, if the only -appearance of digits in the -.I flex -input is in the character class -"[0-9]" then the digits '0', '1', ..., '9' will all be put -in the same equivalence class). Equivalence classes usually give -dramatic reductions in the final table/object file sizes (typically -a factor of 2-5) and are pretty cheap performance-wise (one array -look-up per character scanned). -.IP -.B -Cf -specifies that the -.I full -scanner tables should be generated - -.I flex -should not compress the -tables by taking advantages of similar transition functions for -different states. -.IP -.B -CF -specifies that the alternate fast scanner representation (described -above under the -.B -F -flag) -should be used. -.IP -.B -Cm -directs -.I flex -to construct -.I meta-equivalence classes, -which are sets of equivalence classes (or characters, if equivalence -classes are not being used) that are commonly used together. Meta-equivalence -classes are often a big win when using compressed tables, but they -have a moderate performance impact (one or two "if" tests and one -array look-up per character scanned). -.IP -A lone -.B -C -specifies that the scanner tables should be compressed but neither -equivalence classes nor meta-equivalence classes should be used. -.IP -The options -.B -Cf -or -.B -CF -and -.B -Cm -do not make sense together - there is no opportunity for meta-equivalence -classes if the table is not being compressed. Otherwise the options -may be freely mixed. -.IP -The default setting is -.B -Cem, -which specifies that -.I flex -should generate equivalence classes -and meta-equivalence classes. This setting provides the highest -degree of table compression. You can trade off -faster-executing scanners at the cost of larger tables with -the following generally being true: -.nf - - slowest & smallest - -Cem - -Cm - -Ce - -C - -C{f,F}e - -C{f,F} - fastest & largest - -.fi -Note that scanners with the smallest tables are usually generated and -compiled the quickest, so -during development you will usually want to use the default, maximal -compression. -.IP -.B -Cfe -is often a good compromise between speed and size for production -scanners. -.IP -.B -C -options are not cumulative; whenever the flag is encountered, the -previous -C settings are forgotten. -.TP -.B -Sskeleton_file -overrides the default skeleton file from which -.I flex -constructs its scanners. You'll never need this option unless you are doing -.I flex -maintenance or development. -.SH PERFORMANCE CONSIDERATIONS -The main design goal of -.I flex -is that it generate high-performance scanners. It has been optimized -for dealing well with large sets of rules. Aside from the effects -of table compression on scanner speed outlined above, -there are a number of options/actions which degrade performance. These -are, from most expensive to least: -.nf - - REJECT - - pattern sets that require backtracking - arbitrary trailing context - - '^' beginning-of-line operator - yymore() - -.fi -with the first three all being quite expensive and the last two -being quite cheap. -.LP -.B REJECT -should be avoided at all costs when performance is important. -It is a particularly expensive option. -.LP -Getting rid of backtracking is messy and often may be an enormous -amount of work for a complicated scanner. In principal, one begins -by using the -.B -b -flag to generate a -.I lex.backtrack -file. For example, on the input -.nf - - %% - foo return TOK_KEYWORD; - foobar return TOK_KEYWORD; - -.fi -the file looks like: -.nf - - State #6 is non-accepting - - associated rule line numbers: - 2 3 - out-transitions: [ o ] - jam-transitions: EOF [ \\001-n p-\\177 ] - - State #8 is non-accepting - - associated rule line numbers: - 3 - out-transitions: [ a ] - jam-transitions: EOF [ \\001-` b-\\177 ] - - State #9 is non-accepting - - associated rule line numbers: - 3 - out-transitions: [ r ] - jam-transitions: EOF [ \\001-q s-\\177 ] - - Compressed tables always backtrack. - -.fi -The first few lines tell us that there's a scanner state in -which it can make a transition on an 'o' but not on any other -character, and that in that state the currently scanned text does not match -any rule. The state occurs when trying to match the rules found -at lines 2 and 3 in the input file. -If the scanner is in that state and then reads -something other than an 'o', it will have to backtrack to find -a rule which is matched. With -a bit of headscratching one can see that this must be the -state it's in when it has seen "fo". When this has happened, -if anything other than another 'o' is seen, the scanner will -have to back up to simply match the 'f' (by the default rule). -.LP -The comment regarding State #8 indicates there's a problem -when "foob" has been scanned. Indeed, on any character other -than a 'b', the scanner will have to back up to accept "foo". -Similarly, the comment for State #9 concerns when "fooba" has -been scanned. -.LP -The final comment reminds us that there's no point going to -all the trouble of removing backtracking from the rules unless -we're using -.B -f -or -.B -F, -since there's no performance gain doing so with compressed scanners. -.LP -The way to remove the backtracking is to add "error" rules: -.nf - - %% - foo return TOK_KEYWORD; - foobar return TOK_KEYWORD; - - fooba | - foob | - fo { - /* false alarm, not really a keyword */ - return TOK_ID; - } - -.fi -.LP -Eliminating backtracking among a list of keywords can also be -done using a "catch-all" rule: -.nf - - %% - foo return TOK_KEYWORD; - foobar return TOK_KEYWORD; - - [a-z]+ return TOK_ID; - -.fi -This is usually the best solution when appropriate. -.LP -Backtracking messages tend to cascade. -With a complicated set of rules it's not uncommon to get hundreds -of messages. If one can decipher them, though, it often -only takes a dozen or so rules to eliminate the backtracking (though -it's easy to make a mistake and have an error rule accidentally match -a valid token. A possible future -.I flex -feature will be to automatically add rules to eliminate backtracking). -.LP -.I Variable -trailing context (where both the leading and trailing parts do not have -a fixed length) entails almost the same performance loss as -.I REJECT -(i.e., substantial). So when possible a rule like: -.nf - - %% - mouse|rat/(cat|dog) run(); - -.fi -is better written: -.nf - - %% - mouse/cat|dog run(); - rat/cat|dog run(); - -.fi -or as -.nf - - %% - mouse|rat/cat run(); - mouse|rat/dog run(); - -.fi -Note that here the special '|' action does -.I not -provide any savings, and can even make things worse (see -.B BUGS -in flex(1)). -.LP -Another area where the user can increase a scanner's performance -(and one that's easier to implement) arises from the fact that -the longer the tokens matched, the faster the scanner will run. -This is because with long tokens the processing of most input -characters takes place in the (short) inner scanning loop, and -does not often have to go through the additional work of setting up -the scanning environment (e.g., -.B yytext) -for the action. Recall the scanner for C comments: -.nf - - %x comment - %% - int line_num = 1; - - "/*" BEGIN(comment); - - [^*\\n]* - "*"+[^*/\\n]* - \\n ++line_num; - "*"+"/" BEGIN(INITIAL); - -.fi -This could be sped up by writing it as: -.nf - - %x comment - %% - int line_num = 1; - - "/*" BEGIN(comment); - - [^*\\n]* - [^*\\n]*\\n ++line_num; - "*"+[^*/\\n]* - "*"+[^*/\\n]*\\n ++line_num; - "*"+"/" BEGIN(INITIAL); - -.fi -Now instead of each newline requiring the processing of another -action, recognizing the newlines is "distributed" over the other rules -to keep the matched text as long as possible. Note that -.I adding -rules does -.I not -slow down the scanner! The speed of the scanner is independent -of the number of rules or (modulo the considerations given at the -beginning of this section) how complicated the rules are with -regard to operators such as '*' and '|'. -.LP -A final example in speeding up a scanner: suppose you want to scan -through a file containing identifiers and keywords, one per line -and with no other extraneous characters, and recognize all the -keywords. A natural first approach is: -.nf - - %% - asm | - auto | - break | - ... etc ... - volatile | - while /* it's a keyword */ - - .|\\n /* it's not a keyword */ - -.fi -To eliminate the back-tracking, introduce a catch-all rule: -.nf - - %% - asm | - auto | - break | - ... etc ... - volatile | - while /* it's a keyword */ - - [a-z]+ | - .|\\n /* it's not a keyword */ - -.fi -Now, if it's guaranteed that there's exactly one word per line, -then we can reduce the total number of matches by a half by -merging in the recognition of newlines with that of the other -tokens: -.nf - - %% - asm\\n | - auto\\n | - break\\n | - ... etc ... - volatile\\n | - while\\n /* it's a keyword */ - - [a-z]+\\n | - .|\\n /* it's not a keyword */ - -.fi -One has to be careful here, as we have now reintroduced backtracking -into the scanner. In particular, while -.I we -know that there will never be any characters in the input stream -other than letters or newlines, -.I flex -can't figure this out, and it will plan for possibly needing backtracking -when it has scanned a token like "auto" and then the next character -is something other than a newline or a letter. Previously it would -then just match the "auto" rule and be done, but now it has no "auto" -rule, only a "auto\\n" rule. To eliminate the possibility of backtracking, -we could either duplicate all rules but without final newlines, or, -since we never expect to encounter such an input and therefore don't -how it's classified, we can introduce one more catch-all rule, this -one which doesn't include a newline: -.nf - - %% - asm\\n | - auto\\n | - break\\n | - ... etc ... - volatile\\n | - while\\n /* it's a keyword */ - - [a-z]+\\n | - [a-z]+ | - .|\\n /* it's not a keyword */ - -.fi -Compiled with -.B -Cf, -this is about as fast as one can get a -.I flex -scanner to go for this particular problem. -.LP -A final note: -.I flex -is slow when matching NUL's, particularly when a token contains -multiple NUL's. -It's best to write rules which match -.I short -amounts of text if it's anticipated that the text will often include NUL's. -.SH INCOMPATIBILITIES WITH LEX AND POSIX -.I flex -is a rewrite of the Unix -.I lex -tool (the two implementations do not share any code, though), -with some extensions and incompatibilities, both of which -are of concern to those who wish to write scanners acceptable -to either implementation. At present, the POSIX -.I lex -draft is -very close to the original -.I lex -implementation, so some of these -incompatibilities are also in conflict with the POSIX draft. But -the intent is that except as noted below, -.I flex -as it presently stands will -ultimately be POSIX conformant (i.e., that those areas of conflict with -the POSIX draft will be resolved in -.I flex's -favor). Please bear in -mind that all the comments which follow are with regard to the POSIX -.I draft -standard of Summer 1989, and not the final document (or subsequent -drafts); they are included so -.I flex -users can be aware of the standardization issues and those areas where -.I flex -may in the near future undergo changes incompatible with -its current definition. -.LP -.I flex -is fully compatible with -.I lex -with the following exceptions: -.IP - -The undocumented -.I lex -scanner internal variable -.B yylineno -is not supported. It is difficult to support this option efficiently, -since it requires examining every character scanned and reexamining -the characters when the scanner backs up. -Things get more complicated when the end of buffer or file is reached or a -NUL is scanned (since the scan must then be restarted with the proper line -number count), or the user uses the yyless(), unput(), or REJECT actions, -or the multiple input buffer functions. -.IP -The fix is to add rules which, upon seeing a newline, increment -yylineno. This is usually an easy process, though it can be a drag if some -of the patterns can match multiple newlines along with other characters. -.IP -yylineno is not part of the POSIX draft. -.IP - -The -.B input() -routine is not redefinable, though it may be called to read characters -following whatever has been matched by a rule. If -.B input() -encounters an end-of-file the normal -.B yywrap() -processing is done. A ``real'' end-of-file is returned by -.B input() -as -.I EOF. -.IP -Input is instead controlled by redefining the -.B YY_INPUT -macro. -.IP -The -.I flex -restriction that -.B input() -cannot be redefined is in accordance with the POSIX draft, but -.B YY_INPUT -has not yet been accepted into the draft (and probably won't; it looks -like the draft will simply not specify any way of controlling the -scanner's input other than by making an initial assignment to -.I yyin). -.IP - -.I flex -scanners do not use stdio for input. Because of this, when writing an -interactive scanner one must explicitly call fflush() on the -stream associated with the terminal after writing out a prompt. -With -.I lex -such writes are automatically flushed since -.I lex -scanners use -.B getchar() -for their input. Also, when writing interactive scanners with -.I flex, -the -.B -I -flag must be used. -.IP - -.I flex -scanners are not as reentrant as -.I lex -scanners. In particular, if you have an interactive scanner and -an interrupt handler which long-jumps out of the scanner, and -the scanner is subsequently called again, you may get the following -message: -.nf - - fatal flex scanner internal error--end of buffer missed - -.fi -To reenter the scanner, first use -.nf - - yyrestart( yyin ); - -.fi -.IP - -.B output() -is not supported. -Output from the -.B ECHO -macro is done to the file-pointer -.I yyout -(default -.I stdout). -.IP -The POSIX draft mentions that an -.B output() -routine exists but currently gives no details as to what it does. -.IP - -.I lex -does not support exclusive start conditions (%x), though they -are in the current POSIX draft. -.IP - -When definitions are expanded, -.I flex -encloses them in parentheses. -With lex, the following: -.nf - - NAME [A-Z][A-Z0-9]* - %% - foo{NAME}? printf( "Found it\\n" ); - %% - -.fi -will not match the string "foo" because when the macro -is expanded the rule is equivalent to "foo[A-Z][A-Z0-9]*?" -and the precedence is such that the '?' is associated with -"[A-Z0-9]*". With -.I flex, -the rule will be expanded to -"foo([A-Z][A-Z0-9]*)?" and so the string "foo" will match. -Note that because of this, the -.B ^, $, , /, -and -.B <> -operators cannot be used in a -.I flex -definition. -.IP -The POSIX draft interpretation is the same as -.I flex's. -.IP - -To specify a character class which matches anything but a left bracket (']'), -in -.I lex -one can use "[^]]" but with -.I flex -one must use "[^\\]]". The latter works with -.I lex, -too. -.IP - -The -.I lex -.B %r -(generate a Ratfor scanner) option is not supported. It is not part -of the POSIX draft. -.IP - -If you are providing your own yywrap() routine, you must include a -"#undef yywrap" in the definitions section (section 1). Note that -the "#undef" will have to be enclosed in %{}'s. -.IP -The POSIX draft -specifies that yywrap() is a function and this is very unlikely to change; so -.I flex users are warned -that -.B yywrap() -is likely to be changed to a function in the near future. -.IP - -After a call to -.B unput(), -.I yytext -and -.I yyleng -are undefined until the next token is matched. This is not the case with -.I lex -or the present POSIX draft. -.IP - -The precedence of the -.B {} -(numeric range) operator is different. -.I lex -interprets "abc{1,3}" as "match one, two, or -three occurrences of 'abc'", whereas -.I flex -interprets it as "match 'ab' -followed by one, two, or three occurrences of 'c'". The latter is -in agreement with the current POSIX draft. -.IP - -The precedence of the -.B ^ -operator is different. -.I lex -interprets "^foo|bar" as "match either 'foo' at the beginning of a line, -or 'bar' anywhere", whereas -.I flex -interprets it as "match either 'foo' or 'bar' if they come at the beginning -of a line". The latter is in agreement with the current POSIX draft. -.IP - -To refer to yytext outside of the scanner source file, -the correct definition with -.I flex -is "extern char *yytext" rather than "extern char yytext[]". -This is contrary to the current POSIX draft but a point on which -.I flex -will not be changing, as the array representation entails a -serious performance penalty. It is hoped that the POSIX draft will -be emended to support the -.I flex -variety of declaration (as this is a fairly painless change to -require of -.I lex -users). -.IP - -.I yyin -is -.I initialized -by -.I lex -to be -.I stdin; -.I flex, -on the other hand, -initializes -.I yyin -to NULL -and then -.I assigns -it to -.I stdin -the first time the scanner is called, providing -.I yyin -has not already been assigned to a non-NULL value. The difference is -subtle, but the net effect is that with -.I flex -scanners, -.I yyin -does not have a valid value until the scanner has been called. -.IP - -The special table-size declarations such as -.B %a -supported by -.I lex -are not required by -.I flex -scanners; -.I flex -ignores them. -.IP - -The name -.bd -FLEX_SCANNER -is #define'd so scanners may be written for use with either -.I flex -or -.I lex. -.LP -The following -.I flex -features are not included in -.I lex -or the POSIX draft standard: -.nf - - yyterminate() - <> - YY_DECL - #line directives - %{}'s around actions - yyrestart() - comments beginning with '#' (deprecated) - multiple actions on a line - -.fi -This last feature refers to the fact that with -.I flex -you can put multiple actions on the same line, separated with -semi-colons, while with -.I lex, -the following -.nf - - foo handle_foo(); ++num_foos_seen; - -.fi -is (rather surprisingly) truncated to -.nf - - foo handle_foo(); - -.fi -.I flex -does not truncate the action. Actions that are not enclosed in -braces are simply terminated at the end of the line. -.SH DIAGNOSTICS -.I reject_used_but_not_detected undefined -or -.I yymore_used_but_not_detected undefined - -These errors can occur at compile time. They indicate that the -scanner uses -.B REJECT -or -.B yymore() -but that -.I flex -failed to notice the fact, meaning that -.I flex -scanned the first two sections looking for occurrences of these actions -and failed to find any, but somehow you snuck some in (via a #include -file, for example). Make an explicit reference to the action in your -.I flex -input file. (Note that previously -.I flex -supported a -.B %used/%unused -mechanism for dealing with this problem; this feature is still supported -but now deprecated, and will go away soon unless the author hears from -people who can argue compellingly that they need it.) -.LP -.I flex scanner jammed - -a scanner compiled with -.B -s -has encountered an input string which wasn't matched by -any of its rules. -.LP -.I flex input buffer overflowed - -a scanner rule matched a string long enough to overflow the -scanner's internal input buffer (16K bytes by default - controlled by -.B YY_BUF_SIZE -in "flex.skel". Note that to redefine this macro, you must first -.B #undefine -it). -.LP -.I scanner requires -8 flag - -Your scanner specification includes recognizing 8-bit characters and -you did not specify the -8 flag (and your site has not installed flex -with -8 as the default). -.LP -.I -fatal flex scanner internal error--end of buffer missed - -This can occur in an scanner which is reentered after a long-jump -has jumped out (or over) the scanner's activation frame. Before -reentering the scanner, use: -.nf - - yyrestart( yyin ); - -.fi -.LP -.I too many %t classes! - -You managed to put every single character into its own %t class. -.I flex -requires that at least one of the classes share characters. -.SH DEFICIENCIES / BUGS -See flex(1). -.SH "SEE ALSO" -.LP -flex(1), lex(1), yacc(1), sed(1), awk(1). -.LP -M. E. Lesk and E. Schmidt, -.I LEX - Lexical Analyzer Generator -.SH AUTHOR -Vern Paxson, with the help of many ideas and much inspiration from -Van Jacobson. Original version by Jef Poskanzer. The fast table -representation is a partial implementation of a design done by Van -Jacobson. The implementation was done by Kevin Gong and Vern Paxson. -.LP -Thanks to the many -.I flex -beta-testers, feedbackers, and contributors, especially Casey -Leedom, benson@odi.com, Keith Bostic, -Frederic Brehm, Nick Christopher, Jason Coughlin, -Scott David Daniels, Leo Eskin, -Chris Faylor, Eric Goldman, Eric -Hughes, Jeffrey R. Jones, Kevin B. Kenny, Ronald Lamprecht, -Greg Lee, Craig Leres, Mohamed el Lozy, Jim Meyering, Marc Nozell, Esmond Pitt, -Jef Poskanzer, Jim Roskind, -Dave Tallman, Frank Whaley, Ken Yap, and those whose names -have slipped my marginal mail-archiving skills but whose contributions -are appreciated all the same. -.LP -Thanks to Keith Bostic, John Gilmore, Craig Leres, Bob -Mulcahy, Rich Salz, and Richard Stallman for help with various distribution -headaches. -.LP -Thanks to Esmond Pitt and Earle Horton for 8-bit character support; -to Benson Margulies and Fred -Burke for C++ support; to Ove Ewerlid for the basics of support for -NUL's; and to Eric Hughes for the basics of support for multiple buffers. -.LP -Work is being done on extending -.I flex -to generate scanners in which the -state machine is directly represented in C code rather than tables. -These scanners may well be substantially faster than those generated -using -f or -F. If you are working in this area and are interested -in comparing notes and seeing whether redundant work can be avoided, -contact Ove Ewerlid (ewerlid@mizar.DoCS.UU.SE). -.LP -This work was primarily done when I was at the Real Time Systems Group -at the Lawrence Berkeley Laboratory in Berkeley, CA. Many thanks to all there -for the support I received. -.LP -Send comments to: -.nf - - Vern Paxson - Computer Science Department - 4126 Upson Hall - Cornell University - Ithaca, NY 14853-7501 - - vern@cs.cornell.edu - decvax!cornell!vern - -.fi diff --git a/util/flex/gen.c b/util/flex/gen.c deleted file mode 100644 index 9f05444fa..000000000 --- a/util/flex/gen.c +++ /dev/null @@ -1,1336 +0,0 @@ -/* gen - actual generation (writing) of flex scanners */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#include "flexdef.h" - - -/* declare functions that have forward references */ - -void gen_next_state PROTO((int)); -void genecs PROTO(()); -void indent_put2s PROTO((char [], char [])); -void indent_puts PROTO((char [])); - - -static int indent_level = 0; /* each level is 4 spaces */ - -#define indent_up() (++indent_level) -#define indent_down() (--indent_level) -#define set_indent(indent_val) indent_level = indent_val - -/* *everything* is done in terms of arrays starting at 1, so provide - * a null entry for the zero element of all C arrays - */ -static char C_short_decl[] = "static const short int %s[%d] =\n { 0,\n"; -static char C_long_decl[] = "static const long int %s[%d] =\n { 0,\n"; -static char C_state_decl[] = - "static const yy_state_type %s[%d] =\n { 0,\n"; - - -/* indent to the current level */ - -void do_indent() - - { - register int i = indent_level * 4; - - while ( i >= 8 ) - { - putchar( '\t' ); - i -= 8; - } - - while ( i > 0 ) - { - putchar( ' ' ); - --i; - } - } - - -/* generate the code to keep backtracking information */ - -void gen_backtracking() - - { - if ( reject || num_backtracking == 0 ) - return; - - if ( fullspd ) - indent_puts( "if ( yy_current_state[-1].yy_nxt )" ); - else - indent_puts( "if ( yy_accept[yy_current_state] )" ); - - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_last_accepting_state = yy_current_state;" ); - indent_puts( "yy_last_accepting_cpos = yy_cp;" ); - indent_puts( "}" ); - indent_down(); - } - - -/* generate the code to perform the backtrack */ - -void gen_bt_action() - - { - if ( reject || num_backtracking == 0 ) - return; - - set_indent( 3 ); - - indent_puts( "case 0: /* must backtrack */" ); - indent_puts( "/* undo the effects of YY_DO_BEFORE_ACTION */" ); - indent_puts( "*yy_cp = yy_hold_char;" ); - - if ( fullspd || fulltbl ) - indent_puts( "yy_cp = yy_last_accepting_cpos + 1;" ); - else - /* backtracking info for compressed tables is taken \after/ - * yy_cp has been incremented for the next state - */ - indent_puts( "yy_cp = yy_last_accepting_cpos;" ); - - indent_puts( "yy_current_state = yy_last_accepting_state;" ); - indent_puts( "goto yy_find_action;" ); - putchar( '\n' ); - - set_indent( 0 ); - } - - -/* genctbl - generates full speed compressed transition table - * - * synopsis - * genctbl(); - */ - -void genctbl() - - { - register int i; - int end_of_buffer_action = num_rules + 1; - - /* table of verify for transition and offset to next state */ - printf( "static const struct yy_trans_info yy_transition[%d] =\n", - tblend + numecs + 1 ); - printf( " {\n" ); - - /* We want the transition to be represented as the offset to the - * next state, not the actual state number, which is what it currently is. - * The offset is base[nxt[i]] - base[chk[i]]. That's just the - * difference between the starting points of the two involved states - * (to - from). - * - * first, though, we need to find some way to put in our end-of-buffer - * flags and states. We do this by making a state with absolutely no - * transitions. We put it at the end of the table. - */ - /* at this point, we're guaranteed that there's enough room in nxt[] - * and chk[] to hold tblend + numecs entries. We need just two slots. - * One for the action and one for the end-of-buffer transition. We - * now *assume* that we're guaranteed the only character we'll try to - * index this nxt/chk pair with is EOB, i.e., 0, so we don't have to - * make sure there's room for jam entries for other characters. - */ - - base[lastdfa + 1] = tblend + 2; - nxt[tblend + 1] = end_of_buffer_action; - chk[tblend + 1] = numecs + 1; - chk[tblend + 2] = 1; /* anything but EOB */ - nxt[tblend + 2] = 0; /* so that "make test" won't show arb. differences */ - - /* make sure every state has a end-of-buffer transition and an action # */ - for ( i = 0; i <= lastdfa; ++i ) - { - register int anum = dfaacc[i].dfaacc_state; - - chk[base[i]] = EOB_POSITION; - chk[base[i] - 1] = ACTION_POSITION; - nxt[base[i] - 1] = anum; /* action number */ - } - - for ( i = 0; i <= tblend; ++i ) - { - if ( chk[i] == EOB_POSITION ) - transition_struct_out( 0, base[lastdfa + 1] - i ); - - else if ( chk[i] == ACTION_POSITION ) - transition_struct_out( 0, nxt[i] ); - - else if ( chk[i] > numecs || chk[i] == 0 ) - transition_struct_out( 0, 0 ); /* unused slot */ - - else /* verify, transition */ - transition_struct_out( chk[i], base[nxt[i]] - (i - chk[i]) ); - } - - - /* here's the final, end-of-buffer state */ - transition_struct_out( chk[tblend + 1], nxt[tblend + 1] ); - transition_struct_out( chk[tblend + 2], nxt[tblend + 2] ); - - printf( " };\n" ); - printf( "\n" ); - - /* table of pointers to start states */ - printf( "static const struct yy_trans_info *yy_start_state_list[%d] =\n", - lastsc * 2 + 1 ); - printf( " {\n" ); - - for ( i = 0; i <= lastsc * 2; ++i ) - printf( " &yy_transition[%d],\n", base[i] ); - - dataend(); - - if ( useecs ) - genecs(); - } - - -/* generate equivalence-class tables */ - -void genecs() - - { - register int i, j; - static char C_char_decl[] = "static const %s %s[%d] =\n { 0,\n"; - int numrows; - Char clower(); - - if ( numecs < csize ) - printf( C_char_decl, "YY_CHAR", "yy_ec", csize ); - else - printf( C_char_decl, "short", "yy_ec", csize ); - - for ( i = 1; i < csize; ++i ) - { - if ( caseins && (i >= 'A') && (i <= 'Z') ) - ecgroup[i] = ecgroup[clower( i )]; - - ecgroup[i] = abs( ecgroup[i] ); - mkdata( ecgroup[i] ); - } - - dataend(); - - if ( trace ) - { - char *readable_form(); - - fputs( "\n\nEquivalence Classes:\n\n", stderr ); - - numrows = csize / 8; - - for ( j = 0; j < numrows; ++j ) - { - for ( i = j; i < csize; i = i + numrows ) - { - fprintf( stderr, "%4s = %-2d", readable_form( i ), ecgroup[i] ); - - putc( ' ', stderr ); - } - - putc( '\n', stderr ); - } - } - } - - -/* generate the code to find the action number */ - -void gen_find_action() - - { - if ( fullspd ) - indent_puts( "yy_act = yy_current_state[-1].yy_nxt;" ); - - else if ( fulltbl ) - indent_puts( "yy_act = yy_accept[yy_current_state];" ); - - else if ( reject ) - { - indent_puts( "yy_current_state = *--yy_state_ptr;" ); - indent_puts( "yy_lp = yy_accept[yy_current_state];" ); - - puts( "find_rule: /* we branch to this label when backtracking */" ); - - indent_puts( "for ( ; ; ) /* until we find what rule we matched */" ); - - indent_up(); - - indent_puts( "{" ); - - indent_puts( "if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_act = yy_acclist[yy_lp];" ); - - if ( variable_trailing_context_rules ) - { - indent_puts( "if ( yy_act & YY_TRAILING_HEAD_MASK ||" ); - indent_puts( " yy_looking_for_trail_begin )" ); - indent_up(); - indent_puts( "{" ); - - indent_puts( "if ( yy_act == yy_looking_for_trail_begin )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_looking_for_trail_begin = 0;" ); - indent_puts( "yy_act &= ~YY_TRAILING_HEAD_MASK;" ); - indent_puts( "break;" ); - indent_puts( "}" ); - indent_down(); - - indent_puts( "}" ); - indent_down(); - - indent_puts( "else if ( yy_act & YY_TRAILING_MASK )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( - "yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK;" ); - indent_puts( - "yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK;" ); - - if ( real_reject ) - { - /* remember matched text in case we back up due to REJECT */ - indent_puts( "yy_full_match = yy_cp;" ); - indent_puts( "yy_full_state = yy_state_ptr;" ); - indent_puts( "yy_full_lp = yy_lp;" ); - } - - indent_puts( "}" ); - indent_down(); - - indent_puts( "else" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_full_match = yy_cp;" ); - indent_puts( "yy_full_state = yy_state_ptr;" ); - indent_puts( "yy_full_lp = yy_lp;" ); - indent_puts( "break;" ); - indent_puts( "}" ); - indent_down(); - - indent_puts( "++yy_lp;" ); - indent_puts( "goto find_rule;" ); - } - - else - { - /* remember matched text in case we back up due to trailing context - * plus REJECT - */ - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_full_match = yy_cp;" ); - indent_puts( "break;" ); - indent_puts( "}" ); - indent_down(); - } - - indent_puts( "}" ); - indent_down(); - - indent_puts( "--yy_cp;" ); - - /* we could consolidate the following two lines with those at - * the beginning, but at the cost of complaints that we're - * branching inside a loop - */ - indent_puts( "yy_current_state = *--yy_state_ptr;" ); - indent_puts( "yy_lp = yy_accept[yy_current_state];" ); - - indent_puts( "}" ); - - indent_down(); - } - - else - /* compressed */ - indent_puts( "yy_act = yy_accept[yy_current_state];" ); - } - - -/* genftbl - generates full transition table - * - * synopsis - * genftbl(); - */ - -void genftbl() - - { - register int i; - int end_of_buffer_action = num_rules + 1; - - printf( C_short_decl, "yy_accept", lastdfa + 1 ); - - - dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; - - for ( i = 1; i <= lastdfa; ++i ) - { - register int anum = dfaacc[i].dfaacc_state; - - mkdata( anum ); - - if ( trace && anum ) - fprintf( stderr, "state # %d accepts: [%d]\n", i, anum ); - } - - dataend(); - - if ( useecs ) - genecs(); - - /* don't have to dump the actual full table entries - they were created - * on-the-fly - */ - } - - -/* generate the code to find the next compressed-table state */ - -void gen_next_compressed_state( char_map ) -char *char_map; - - { - indent_put2s( "register YY_CHAR yy_c = %s;", char_map ); - - /* save the backtracking info \before/ computing the next state - * because we always compute one more state than needed - we - * always proceed until we reach a jam state - */ - gen_backtracking(); - - indent_puts( - "while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_current_state = yy_def[yy_current_state];" ); - - if ( usemecs ) - { - /* we've arrange it so that templates are never chained - * to one another. This means we can afford make a - * very simple test to see if we need to convert to - * yy_c's meta-equivalence class without worrying - * about erroneously looking up the meta-equivalence - * class twice - */ - do_indent(); - /* lastdfa + 2 is the beginning of the templates */ - printf( "if ( yy_current_state >= %d )\n", lastdfa + 2 ); - - indent_up(); - indent_puts( "yy_c = yy_meta[yy_c];" ); - indent_down(); - } - - indent_puts( "}" ); - indent_down(); - - indent_puts( - "yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];" ); - } - - -/* generate the code to find the next match */ - -void gen_next_match() - - { - /* NOTE - changes in here should be reflected in gen_next_state() and - * gen_NUL_trans() - */ - char *char_map = useecs ? "yy_ec[*yy_cp]" : "*yy_cp"; - char *char_map_2 = useecs ? "yy_ec[*++yy_cp]" : "*++yy_cp"; - - if ( fulltbl ) - { - indent_put2s( - "while ( (yy_current_state = yy_nxt[yy_current_state][%s]) > 0 )", - char_map ); - - indent_up(); - - if ( num_backtracking > 0 ) - { - indent_puts( "{" ); - gen_backtracking(); - putchar( '\n' ); - } - - indent_puts( "++yy_cp;" ); - - if ( num_backtracking > 0 ) - indent_puts( "}" ); - - indent_down(); - - putchar( '\n' ); - indent_puts( "yy_current_state = -yy_current_state;" ); - } - - else if ( fullspd ) - { - indent_puts( "{" ); - indent_puts( "register const struct yy_trans_info *yy_trans_info;\n" ); - indent_puts( "register YY_CHAR yy_c;\n" ); - indent_put2s( "for ( yy_c = %s;", char_map ); - indent_puts( - " (yy_trans_info = &yy_current_state[yy_c])->yy_verify == yy_c;" ); - indent_put2s( " yy_c = %s )", char_map_2 ); - - indent_up(); - - if ( num_backtracking > 0 ) - indent_puts( "{" ); - - indent_puts( "yy_current_state += yy_trans_info->yy_nxt;" ); - - if ( num_backtracking > 0 ) - { - putchar( '\n' ); - gen_backtracking(); - indent_puts( "}" ); - } - - indent_down(); - indent_puts( "}" ); - } - - else - { /* compressed */ - indent_puts( "do" ); - - indent_up(); - indent_puts( "{" ); - - gen_next_state( false ); - - indent_puts( "++yy_cp;" ); - - indent_puts( "}" ); - indent_down(); - - do_indent(); - - if ( interactive ) - printf( "while ( yy_base[yy_current_state] != %d );\n", jambase ); - else - printf( "while ( yy_current_state != %d );\n", jamstate ); - - if ( ! reject && ! interactive ) - { - /* do the guaranteed-needed backtrack to figure out the match */ - indent_puts( "yy_cp = yy_last_accepting_cpos;" ); - indent_puts( "yy_current_state = yy_last_accepting_state;" ); - } - } - } - - -/* generate the code to find the next state */ - -void gen_next_state( worry_about_NULs ) -int worry_about_NULs; - - { /* NOTE - changes in here should be reflected in get_next_match() */ - char char_map[256]; - - if ( worry_about_NULs && ! nultrans ) - { - if ( useecs ) - (void) sprintf( char_map, "(*yy_cp ? yy_ec[*yy_cp] : %d)", NUL_ec ); - else - (void) sprintf( char_map, "(*yy_cp ? *yy_cp : %d)", NUL_ec ); - } - - else - (void) strcpy( char_map, useecs ? "yy_ec[*yy_cp]" : "*yy_cp" ); - - if ( worry_about_NULs && nultrans ) - { - if ( ! fulltbl && ! fullspd ) - /* compressed tables backtrack *before* they match */ - gen_backtracking(); - - indent_puts( "if ( *yy_cp )" ); - indent_up(); - indent_puts( "{" ); - } - - if ( fulltbl ) - indent_put2s( "yy_current_state = yy_nxt[yy_current_state][%s];", - char_map ); - - else if ( fullspd ) - indent_put2s( "yy_current_state += yy_current_state[%s].yy_nxt;", - char_map ); - - else - gen_next_compressed_state( char_map ); - - if ( worry_about_NULs && nultrans ) - { - indent_puts( "}" ); - indent_down(); - indent_puts( "else" ); - indent_up(); - indent_puts( "yy_current_state = yy_NUL_trans[yy_current_state];" ); - indent_down(); - } - - if ( fullspd || fulltbl ) - gen_backtracking(); - - if ( reject ) - indent_puts( "*yy_state_ptr++ = yy_current_state;" ); - } - - -/* generate the code to make a NUL transition */ - -void gen_NUL_trans() - - { /* NOTE - changes in here should be reflected in get_next_match() */ - int need_backtracking = (num_backtracking > 0 && ! reject); - - if ( need_backtracking ) - /* we'll need yy_cp lying around for the gen_backtracking() */ - indent_puts( "register YY_CHAR *yy_cp = yy_c_buf_p;" ); - - putchar( '\n' ); - - if ( nultrans ) - { - indent_puts( "yy_current_state = yy_NUL_trans[yy_current_state];" ); - indent_puts( "yy_is_jam = (yy_current_state == 0);" ); - } - - else if ( fulltbl ) - { - do_indent(); - printf( "yy_current_state = yy_nxt[yy_current_state][%d];\n", - NUL_ec ); - indent_puts( "yy_is_jam = (yy_current_state <= 0);" ); - } - - else if ( fullspd ) - { - do_indent(); - printf( "register int yy_c = %d;\n", NUL_ec ); - - indent_puts( - "register const struct yy_trans_info *yy_trans_info;\n" ); - indent_puts( "yy_trans_info = &yy_current_state[yy_c];" ); - indent_puts( "yy_current_state += yy_trans_info->yy_nxt;" ); - - indent_puts( "yy_is_jam = (yy_trans_info->yy_verify != yy_c);" ); - } - - else - { - char NUL_ec_str[20]; - - (void) sprintf( NUL_ec_str, "%d", NUL_ec ); - gen_next_compressed_state( NUL_ec_str ); - - if ( reject ) - indent_puts( "*yy_state_ptr++ = yy_current_state;" ); - - do_indent(); - - if ( interactive ) - printf( "yy_is_jam = (yy_base[yy_current_state] == %d);\n", - jambase ); - else - printf( "yy_is_jam = (yy_current_state == %d);\n", jamstate ); - } - - /* if we've entered an accepting state, backtrack; note that - * compressed tables have *already* done such backtracking, so - * we needn't bother with it again - */ - if ( need_backtracking && (fullspd || fulltbl) ) - { - putchar( '\n' ); - indent_puts( "if ( ! yy_is_jam )" ); - indent_up(); - indent_puts( "{" ); - gen_backtracking(); - indent_puts( "}" ); - indent_down(); - } - } - - -/* generate the code to find the start state */ - -void gen_start_state() - - { - if ( fullspd ) - indent_put2s( "yy_current_state = yy_start_state_list[yy_start%s];", - bol_needed ? " + (yy_bp[-1] == '\\n' ? 1 : 0)" : "" ); - - else - { - indent_puts( "yy_current_state = yy_start;" ); - - if ( bol_needed ) - { - indent_puts( "if ( yy_bp[-1] == '\\n' )" ); - indent_up(); - indent_puts( "++yy_current_state;" ); - indent_down(); - } - - if ( reject ) - { - /* set up for storing up states */ - indent_puts( "yy_state_ptr = yy_state_buf;" ); - indent_puts( "*yy_state_ptr++ = yy_current_state;" ); - } - } - } - - -/* gentabs - generate data statements for the transition tables - * - * synopsis - * gentabs(); - */ - -void gentabs() - - { - int i, j, k, *accset, nacc, *acc_array, total_states; - int end_of_buffer_action = num_rules + 1; - - /* *everything* is done in terms of arrays starting at 1, so provide - * a null entry for the zero element of all C arrays - */ - static char C_char_decl[] = - "static const YY_CHAR %s[%d] =\n { 0,\n"; - - acc_array = allocate_integer_array( current_max_dfas ); - nummt = 0; - - /* the compressed table format jams by entering the "jam state", - * losing information about the previous state in the process. - * In order to recover the previous state, we effectively need - * to keep backtracking information. - */ - ++num_backtracking; - - if ( reject ) - { - /* write out accepting list and pointer list - * - * first we generate the "yy_acclist" array. In the process, we compute - * the indices that will go into the "yy_accept" array, and save the - * indices in the dfaacc array - */ - int EOB_accepting_list[2]; - - /* set up accepting structures for the End Of Buffer state */ - EOB_accepting_list[0] = 0; - EOB_accepting_list[1] = end_of_buffer_action; - accsiz[end_of_buffer_state] = 1; - dfaacc[end_of_buffer_state].dfaacc_set = EOB_accepting_list; - - printf( C_short_decl, "yy_acclist", max( numas, 1 ) + 1 ); - - j = 1; /* index into "yy_acclist" array */ - - for ( i = 1; i <= lastdfa; ++i ) - { - acc_array[i] = j; - - if ( accsiz[i] != 0 ) - { - accset = dfaacc[i].dfaacc_set; - nacc = accsiz[i]; - - if ( trace ) - fprintf( stderr, "state # %d accepts: ", i ); - - for ( k = 1; k <= nacc; ++k ) - { - int accnum = accset[k]; - - ++j; - - if ( variable_trailing_context_rules && - ! (accnum & YY_TRAILING_HEAD_MASK) && - accnum > 0 && accnum <= num_rules && - rule_type[accnum] == RULE_VARIABLE ) - { - /* special hack to flag accepting number as part - * of trailing context rule - */ - accnum |= YY_TRAILING_MASK; - } - - mkdata( accnum ); - - if ( trace ) - { - fprintf( stderr, "[%d]", accset[k] ); - - if ( k < nacc ) - fputs( ", ", stderr ); - else - putc( '\n', stderr ); - } - } - } - } - - /* add accepting number for the "jam" state */ - acc_array[i] = j; - - dataend(); - } - - else - { - dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; - - for ( i = 1; i <= lastdfa; ++i ) - acc_array[i] = dfaacc[i].dfaacc_state; - - /* add accepting number for jam state */ - acc_array[i] = 0; - } - - /* spit out "yy_accept" array. If we're doing "reject", it'll be pointers - * into the "yy_acclist" array. Otherwise it's actual accepting numbers. - * In either case, we just dump the numbers. - */ - - /* "lastdfa + 2" is the size of "yy_accept"; includes room for C arrays - * beginning at 0 and for "jam" state - */ - k = lastdfa + 2; - - if ( reject ) - /* we put a "cap" on the table associating lists of accepting - * numbers with state numbers. This is needed because we tell - * where the end of an accepting list is by looking at where - * the list for the next state starts. - */ - ++k; - - printf( C_short_decl, "yy_accept", k ); - - for ( i = 1; i <= lastdfa; ++i ) - { - mkdata( acc_array[i] ); - - if ( ! reject && trace && acc_array[i] ) - fprintf( stderr, "state # %d accepts: [%d]\n", i, acc_array[i] ); - } - - /* add entry for "jam" state */ - mkdata( acc_array[i] ); - - if ( reject ) - /* add "cap" for the list */ - mkdata( acc_array[i] ); - - dataend(); - - if ( useecs ) - genecs(); - - if ( usemecs ) - { - /* write out meta-equivalence classes (used to index templates with) */ - - if ( trace ) - fputs( "\n\nMeta-Equivalence Classes:\n", stderr ); - - printf( C_char_decl, "yy_meta", numecs + 1 ); - - for ( i = 1; i <= numecs; ++i ) - { - if ( trace ) - fprintf( stderr, "%d = %d\n", i, abs( tecbck[i] ) ); - - mkdata( abs( tecbck[i] ) ); - } - - dataend(); - } - - total_states = lastdfa + numtemps; - - printf( tblend > MAX_SHORT ? C_long_decl : C_short_decl, - "yy_base", total_states + 1 ); - - for ( i = 1; i <= lastdfa; ++i ) - { - register int d = def[i]; - - if ( base[i] == JAMSTATE ) - base[i] = jambase; - - if ( d == JAMSTATE ) - def[i] = jamstate; - - else if ( d < 0 ) - { - /* template reference */ - ++tmpuses; - def[i] = lastdfa - d + 1; - } - - mkdata( base[i] ); - } - - /* generate jam state's base index */ - mkdata( base[i] ); - - for ( ++i /* skip jam state */; i <= total_states; ++i ) - { - mkdata( base[i] ); - def[i] = jamstate; - } - - dataend(); - - printf( tblend > MAX_SHORT ? C_long_decl : C_short_decl, - "yy_def", total_states + 1 ); - - for ( i = 1; i <= total_states; ++i ) - mkdata( def[i] ); - - dataend(); - - printf( lastdfa > MAX_SHORT ? C_long_decl : C_short_decl, - "yy_nxt", tblend + 1 ); - - for ( i = 1; i <= tblend; ++i ) - { - if ( nxt[i] == 0 || chk[i] == 0 ) - nxt[i] = jamstate; /* new state is the JAM state */ - - mkdata( nxt[i] ); - } - - dataend(); - - printf( lastdfa > MAX_SHORT ? C_long_decl : C_short_decl, - "yy_chk", tblend + 1 ); - - for ( i = 1; i <= tblend; ++i ) - { - if ( chk[i] == 0 ) - ++nummt; - - mkdata( chk[i] ); - } - - dataend(); - } - - -/* write out a formatted string (with a secondary string argument) at the - * current indentation level, adding a final newline - */ - -void indent_put2s( fmt, arg ) -char fmt[], arg[]; - - { - do_indent(); - printf( fmt, arg ); - putchar( '\n' ); - } - - -/* write out a string at the current indentation level, adding a final - * newline - */ - -void indent_puts( str ) -char str[]; - - { - do_indent(); - puts( str ); - } - - -/* make_tables - generate transition tables - * - * synopsis - * make_tables(); - * - * Generates transition tables and finishes generating output file - */ - -void make_tables() - - { - register int i; - int did_eof_rule = false; - - skelout(); - - /* first, take care of YY_DO_BEFORE_ACTION depending on yymore being used */ - set_indent( 2 ); - - if ( yymore_used ) - { - indent_puts( "yytext -= yy_more_len; \\" ); - indent_puts( "yyleng = yy_cp - yytext; \\" ); - } - - else - indent_puts( "yyleng = yy_cp - yy_bp; \\" ); - - set_indent( 0 ); - - skelout(); - - - printf( "#define YY_END_OF_BUFFER %d\n", num_rules + 1 ); - - if ( fullspd ) - { /* need to define the transet type as a size large - * enough to hold the biggest offset - */ - int total_table_size = tblend + numecs + 1; - char *trans_offset_type = - total_table_size > MAX_SHORT ? "long" : "short"; - - set_indent( 0 ); - indent_puts( "struct yy_trans_info" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "short yy_verify;" ); - - /* in cases where its sister yy_verify *is* a "yes, there is a - * transition", yy_nxt is the offset (in records) to the next state. - * In most cases where there is no transition, the value of yy_nxt - * is irrelevant. If yy_nxt is the -1th record of a state, though, - * then yy_nxt is the action number for that state - */ - - indent_put2s( "%s yy_nxt;", trans_offset_type ); - indent_puts( "};" ); - indent_down(); - - indent_puts( "typedef const struct yy_trans_info *yy_state_type;" ); - } - - else - indent_puts( "typedef int yy_state_type;" ); - - if ( fullspd ) - genctbl(); - - else if ( fulltbl ) - genftbl(); - - else - gentabs(); - - if ( num_backtracking > 0 ) - { - indent_puts( "static yy_state_type yy_last_accepting_state;" ); - indent_puts( "static YY_CHAR *yy_last_accepting_cpos;\n" ); - } - - if ( nultrans ) - { - printf( C_state_decl, "yy_NUL_trans", lastdfa + 1 ); - - for ( i = 1; i <= lastdfa; ++i ) - { - if ( fullspd ) - { - if ( nultrans ) - printf( " &yy_transition[%d],\n", base[i] ); - else - printf( " 0,\n" ); - } - - else - mkdata( nultrans[i] ); - } - - dataend(); - } - - if ( ddebug ) - { /* spit out table mapping rules to line numbers */ - indent_puts( "extern int yy_flex_debug;" ); - indent_puts( "int yy_flex_debug = 1;\n" ); - - printf( C_short_decl, "yy_rule_linenum", num_rules ); - for ( i = 1; i < num_rules; ++i ) - mkdata( rule_linenum[i] ); - dataend(); - } - - if ( reject ) - { - /* declare state buffer variables */ - puts( - "static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;" ); - puts( "static YY_CHAR *yy_full_match;" ); - puts( "static int yy_lp;" ); - - if ( variable_trailing_context_rules ) - { - puts( "static int yy_looking_for_trail_begin = 0;" ); - puts( "static int yy_full_lp;" ); - puts( "static int *yy_full_state;" ); - printf( "#define YY_TRAILING_MASK 0x%x\n", YY_TRAILING_MASK ); - printf( "#define YY_TRAILING_HEAD_MASK 0x%x\n", - YY_TRAILING_HEAD_MASK ); - } - - puts( "#define REJECT \\" ); - puts( "{ \\" ); - puts( - "*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \\" ); - puts( - "yy_cp = yy_full_match; /* restore poss. backed-over text */ \\" ); - - if ( variable_trailing_context_rules ) - { - puts( "yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \\" ); - puts( - "yy_state_ptr = yy_full_state; /* restore orig. state */ \\" ); - puts( - "yy_current_state = *yy_state_ptr; /* restore curr. state */ \\" ); - } - - puts( "++yy_lp; \\" ); - puts( "goto find_rule; \\" ); - puts( "}" ); - } - - else - { - puts( "/* the intent behind this definition is that it'll catch" ); - puts( " * any uses of REJECT which flex missed" ); - puts( " */" ); - puts( "#define REJECT reject_used_but_not_detected" ); - } - - if ( yymore_used ) - { - indent_puts( "static int yy_more_flag = 0;" ); - indent_puts( "static int yy_doing_yy_more = 0;" ); - indent_puts( "static int yy_more_len = 0;" ); - indent_puts( - "#define yymore() { yy_more_flag = 1; }" ); - indent_puts( - "#define YY_MORE_ADJ (yy_doing_yy_more ? yy_more_len : 0)" ); - } - - else - { - indent_puts( "#define yymore() yymore_used_but_not_detected" ); - indent_puts( "#define YY_MORE_ADJ 0" ); - } - - skelout(); - - if ( ferror( temp_action_file ) ) - flexfatal( "error occurred when writing temporary action file" ); - - else if ( fclose( temp_action_file ) ) - flexfatal( "error occurred when closing temporary action file" ); - - temp_action_file = fopen( action_file_name, "r" ); - - if ( temp_action_file == NULL ) - flexfatal( "could not re-open temporary action file" ); - - /* copy prolog from action_file to output file */ - action_out(); - - skelout(); - - set_indent( 2 ); - - if ( yymore_used ) - { - indent_puts( "yy_more_len = 0;" ); - indent_puts( "yy_doing_yy_more = yy_more_flag;" ); - indent_puts( "if ( yy_doing_yy_more )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_more_len = yyleng;" ); - indent_puts( "yy_more_flag = 0;" ); - indent_puts( "}" ); - indent_down(); - } - - skelout(); - - gen_start_state(); - - /* note, don't use any indentation */ - puts( "yy_match:" ); - gen_next_match(); - - skelout(); - set_indent( 2 ); - gen_find_action(); - - skelout(); - if ( ddebug ) - { - indent_puts( "if ( yy_flex_debug )" ); - indent_up(); - - indent_puts( "{" ); - indent_puts( "if ( yy_act == 0 )" ); - indent_up(); - indent_puts( "fprintf( stderr, \"--scanner backtracking\\n\" );" ); - indent_down(); - - do_indent(); - printf( "else if ( yy_act < %d )\n", num_rules ); - indent_up(); - indent_puts( - "fprintf( stderr, \"--accepting rule at line %d (\\\"%s\\\")\\n\"," ); - indent_puts( " yy_rule_linenum[yy_act], yytext );" ); - indent_down(); - - do_indent(); - printf( "else if ( yy_act == %d )\n", num_rules ); - indent_up(); - indent_puts( - "fprintf( stderr, \"--accepting default rule (\\\"%s\\\")\\n\"," ); - indent_puts( " yytext );" ); - indent_down(); - - do_indent(); - printf( "else if ( yy_act == %d )\n", num_rules + 1 ); - indent_up(); - indent_puts( "fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );" ); - indent_down(); - - do_indent(); - printf( "else\n" ); - indent_up(); - indent_puts( "fprintf( stderr, \"--EOF\\n\" );" ); - indent_down(); - - indent_puts( "}" ); - indent_down(); - } - - /* copy actions from action_file to output file */ - skelout(); - indent_up(); - gen_bt_action(); - action_out(); - - /* generate cases for any missing EOF rules */ - for ( i = 1; i <= lastsc; ++i ) - if ( ! sceof[i] ) - { - do_indent(); - printf( "case YY_STATE_EOF(%s):\n", scname[i] ); - did_eof_rule = true; - } - - if ( did_eof_rule ) - { - indent_up(); - indent_puts( "yyterminate();" ); - indent_down(); - } - - - /* generate code for handling NUL's, if needed */ - - /* first, deal with backtracking and setting up yy_cp if the scanner - * finds that it should JAM on the NUL - */ - skelout(); - set_indent( 7 ); - - if ( fullspd || fulltbl ) - indent_puts( "yy_cp = yy_c_buf_p;" ); - - else - { /* compressed table */ - if ( ! reject && ! interactive ) - { - /* do the guaranteed-needed backtrack to figure out the match */ - indent_puts( "yy_cp = yy_last_accepting_cpos;" ); - indent_puts( "yy_current_state = yy_last_accepting_state;" ); - } - } - - - /* generate code for yy_get_previous_state() */ - set_indent( 1 ); - skelout(); - - if ( bol_needed ) - indent_puts( "register YY_CHAR *yy_bp = yytext;\n" ); - - gen_start_state(); - - set_indent( 2 ); - skelout(); - gen_next_state( true ); - - set_indent( 1 ); - skelout(); - gen_NUL_trans(); - - skelout(); - - /* copy remainder of input to output */ - - line_directive_out( stdout ); - (void) flexscan(); /* copy remainder of input to output */ - } diff --git a/util/flex/initscan.c b/util/flex/initscan.c deleted file mode 100644 index 3cdb5faea..000000000 --- a/util/flex/initscan.c +++ /dev/null @@ -1,2294 +0,0 @@ -/* A lexical scanner generated by flex */ - -/* scanner skeleton version: - * $Id$ - */ - -#define FLEX_SCANNER - -#include - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include -#include - -/* use prototypes in function declarations */ -#define YY_USE_PROTOS - -/* the "const" storage-class-modifier is valid */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#ifdef __STDC__ - -#ifdef __GNUC__ -#include -void *malloc( size_t ); -void free( void* ); -#else -#include -#endif /* __GNUC__ */ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - - -#ifdef __TURBOC__ -#define YY_USE_CONST -#endif - - -#ifndef YY_USE_CONST -#define const -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -/* we can't get here if it's an ANSI C compiler, or a C++ compiler, - * so it's got to be a K&R compiler, and therefore there's no standard - * place from which to include these definitions - */ -char *malloc(); -int free(); -int read(); -#endif - - -/* amount of stuff to slurp up with each read */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* returned upon end-of-file */ -#define YY_END_TOK 0 - -/* copy whatever the last rule matched to the standard output */ - -/* cast to (char *) is because for 8-bit chars, yytext is (unsigned char *) */ -/* this used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite() - */ -#define ECHO (void) fwrite( (char *) yytext, yyleng, 1, yyout ) - -/* gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#define YY_INPUT(buf,result,max_size) \ - if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ - YY_FATAL_ERROR( "read() in flex scanner failed" ); -#define YY_NULL 0 - -/* no semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#define yyterminate() return ( YY_NULL ) - -/* report a fatal error */ - -/* The funky do-while is used to turn this macro definition into - * a single C statement (which needs a semi-colon terminator). - * This avoids problems with code like: - * - * if ( something_happens ) - * YY_FATAL_ERROR( "oops, the something happened" ); - * else - * everything_okay(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the YY_FATAL_ERROR() call. - */ - -#define YY_FATAL_ERROR(msg) \ - do \ - { \ - (void) fputs( msg, stderr ); \ - (void) putc( '\n', stderr ); \ - exit( 1 ); \ - } \ - while ( 0 ) - -/* default yywrap function - always treat EOF as an EOF */ -#define yywrap() 1 - -/* enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN - */ -#define BEGIN yy_start = 1 + 2 * - -/* action number for EOF rule of a given start state */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* special action meaning "start processing a new file" */ -#define YY_NEW_FILE \ - do \ - { \ - yy_init_buffer( yy_current_buffer, yyin ); \ - yy_load_buffer_state(); \ - } \ - while ( 0 ) - -/* default declaration of generated scanner - a define so the user can - * easily add parameters - */ -#define YY_DECL int yylex YY_PROTO(( void )) - -/* code executed at the end of each rule */ -#define YY_BREAK break; - -#define YY_END_OF_BUFFER_CHAR 0 - -#ifndef YY_BUF_SIZE -#define YY_BUF_SIZE (YY_READ_BUF_SIZE * 2) /* size of default input buffer */ -#endif - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -#define YY_CHAR unsigned char -# line 1 "scan.l" -#define INITIAL 0 -/* scan.l - scanner for flex input */ -# line 5 "scan.l" -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#undef yywrap - -#include "flexdef.h" -#include "parse.h" - -#define ACTION_ECHO fprintf( temp_action_file, "%s", yytext ) -#define MARK_END_OF_PROLOG fprintf( temp_action_file, "%%%% end of prolog\n" ); - -#undef YY_DECL -#define YY_DECL \ - int flexscan() - -#define RETURNCHAR \ - yylval = yytext[0]; \ - return ( CHAR ); - -#define RETURNNAME \ - (void) strcpy( nmstr, (char *) yytext ); \ - return ( NAME ); - -#define PUT_BACK_STRING(str, start) \ - for ( i = strlen( (char *) (str) ) - 1; i >= start; --i ) \ - unput((str)[i]) - -#define CHECK_REJECT(str) \ - if ( all_upper( str ) ) \ - reject = true; - -#define CHECK_YYMORE(str) \ - if ( all_lower( str ) ) \ - yymore_used = true; -#define SECT2 1 -#define SECT2PROLOG 2 -#define SECT3 3 -#define CODEBLOCK 4 -#define PICKUPDEF 5 -#define SC 6 -#define CARETISBOL 7 -#define NUM 8 -#define QUOTE 9 -#define FIRSTCCL 10 -#define CCL 11 -#define ACTION 12 -#define RECOVER 13 -#define BRACEERROR 14 -#define C_COMMENT 15 -#define ACTION_COMMENT 16 -#define ACTION_STRING 17 -#define PERCENT_BRACE_ACTION 18 -#define USED_LIST 19 -#define CODEBLOCK_2 20 -#define XLATION 21 -# line 84 "scan.l" - -/* done after the current pattern has been matched and before the - * corresponding action - sets up yytext - */ -#define YY_DO_BEFORE_ACTION \ - yytext = yy_bp; \ - yyleng = yy_cp - yy_bp; \ - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yy_c_buf_p = yy_cp; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* return all but the first 'n' matched characters back to the input stream */ -#define yyless(n) \ - do \ - { \ - /* undo effects of setting up yytext */ \ - *yy_cp = yy_hold_char; \ - yy_c_buf_p = yy_cp = yy_bp + n; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, yytext ) - - -struct yy_buffer_state - { - FILE *yy_input_file; - - YY_CHAR *yy_ch_buf; /* input buffer */ - YY_CHAR *yy_buf_pos; /* current position in input buffer */ - - /* size of input buffer in bytes, not including room for EOB characters*/ - int yy_buf_size; - - /* number of characters read into yy_ch_buf, not including EOB characters */ - int yy_n_chars; - - int yy_eof_status; /* whether we've seen an EOF on this buffer */ -#define EOF_NOT_SEEN 0 - /* "pending" happens when the EOF has been seen but there's still - * some text process - */ -#define EOF_PENDING 1 -#define EOF_DONE 2 - }; - -static YY_BUFFER_STATE yy_current_buffer; - -/* we provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state" - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -/* yy_hold_char holds the character lost when yytext is formed */ -static YY_CHAR yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - - -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -#ifndef YY_USER_INIT -#define YY_USER_INIT -#endif - -extern YY_CHAR *yytext; -extern int yyleng; -extern FILE *yyin, *yyout; - -YY_CHAR *yytext; -int yyleng; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; - -#define YY_END_OF_BUFFER 121 -typedef int yy_state_type; -static const short int yy_accept[341] = - { 0, - 0, 0, 0, 0, 0, 0, 119, 119, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 121, 19, 7, 18, 19, 16, - 1, 17, 19, 19, 19, 15, 67, 59, 60, 53, - 67, 66, 51, 67, 67, 67, 50, 49, 67, 52, - 120, 47, 119, 119, 28, 29, 28, 28, 28, 28, - 31, 30, 32, 73, 120, 69, 70, 72, 74, 88, - 89, 86, 85, 87, 75, 77, 76, 75, 81, 80, - - 81, 81, 83, 83, 83, 84, 99, 104, 103, 105, - 105, 100, 100, 100, 97, 98, 120, 33, 91, 90, - 22, 24, 23, 107, 109, 108, 111, 113, 114, 115, - 95, 95, 96, 95, 95, 95, 95, 38, 35, 34, - 38, 38, 44, 42, 45, 44, 44, 41, 41, 41, - 40, 41, 7, 18, 0, 16, 1, 17, 0, 2, - 14, 8, 0, 12, 4, 0, 0, 5, 0, 3, - 15, 59, 60, 0, 0, 56, 0, 0, 0, 117, - 117, 117, 55, 54, 55, 50, 49, 63, 50, 0, - 47, 46, 119, 119, 28, 28, 28, 28, 28, 31, - - 30, 71, 72, 85, 118, 118, 118, 78, 79, 82, - 99, 0, 102, 0, 101, 100, 100, 100, 0, 33, - 22, 20, 107, 106, 111, 112, 95, 95, 95, 92, - 95, 95, 95, 38, 35, 38, 38, 42, 0, 43, - 43, 43, 42, 40, 0, 13, 14, 8, 8, 0, - 12, 4, 0, 0, 0, 5, 0, 6, 57, 0, - 58, 0, 64, 0, 0, 117, 117, 55, 55, 65, - 63, 28, 28, 28, 25, 0, 118, 118, 100, 100, - 0, 21, 92, 92, 95, 95, 38, 38, 0, 39, - 43, 43, 0, 11, 4, 0, 11, 0, 0, 5, - - 0, 0, 0, 117, 28, 28, 118, 100, 100, 95, - 95, 38, 38, 43, 0, 9, 0, 0, 0, 28, - 28, 100, 100, 95, 95, 38, 38, 0, 0, 26, - 27, 93, 94, 93, 94, 36, 37, 10, 62, 0 - } ; - -static const YY_CHAR yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 5, 1, 6, 7, 8, 9, 1, 10, 11, - 11, 12, 11, 13, 14, 11, 15, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 1, 1, 17, - 1, 18, 11, 1, 24, 25, 26, 27, 28, 29, - 23, 23, 23, 30, 31, 23, 32, 33, 34, 31, - 23, 35, 36, 37, 38, 23, 23, 39, 40, 23, - 19, 20, 21, 22, 23, 1, 24, 25, 26, 27, - - 28, 29, 23, 23, 23, 30, 31, 23, 32, 33, - 34, 31, 23, 35, 36, 37, 38, 23, 23, 39, - 40, 23, 41, 42, 43, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static const YY_CHAR yy_meta[44] = - { 0, - 1, 2, 3, 2, 2, 4, 1, 1, 1, 5, - 1, 6, 1, 7, 5, 8, 1, 1, 1, 9, - 10, 1, 11, 12, 12, 12, 12, 12, 12, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 5, 1, 13 - } ; - -static const short int yy_base[404] = - { 0, - 0, 43, 85, 126, 1371, 1370, 1369, 1353, 168, 1346, - 104, 108, 211, 0, 1332, 1320, 120, 252, 95, 119, - 137, 144, 100, 141, 295, 0, 1327, 1323, 113, 336, - 254, 255, 257, 258, 253, 268, 379, 0, 338, 421, - 0, 0, 273, 460, 1325, 1442, 281, 1442, 1287, 0, - 287, 1442, 1279, 472, 1257, 0, 1442, 425, 1442, 1442, - 147, 1442, 1239, 1235, 78, 513, 433, 1442, 83, 1442, - 1248, 0, 1247, 1442, 0, 1442, 0, 1218, 1205, 1194, - 0, 342, 1442, 1442, 1442, 1442, 1202, 0, 1442, 1442, - 1442, 1442, 1201, 1442, 1442, 1442, 1442, 79, 1442, 1442, - - 103, 1198, 1442, 0, 248, 1442, 0, 1442, 1442, 252, - 1199, 0, 1173, 1158, 1442, 1442, 1185, 1442, 1442, 1442, - 0, 1442, 1170, 0, 1442, 1152, 0, 1442, 1442, 0, - 0, 346, 1442, 1123, 0, 1125, 1105, 0, 352, 1442, - 1116, 1103, 1442, 356, 1442, 1100, 329, 1442, 360, 1093, - 1101, 333, 441, 1442, 445, 0, 449, 1442, 1101, 1442, - 365, 453, 1094, 466, 0, 480, 330, 0, 1095, 1442, - 0, 555, 1442, 1044, 1077, 1442, 1051, 133, 456, 1442, - 1059, 0, 0, 1442, 584, 563, 1442, 0, 1442, 1071, - 0, 1442, 1063, 1442, 0, 0, 1010, 1007, 627, 0, - - 484, 1442, 0, 998, 1442, 992, 0, 1442, 1442, 1442, - 0, 421, 1442, 0, 1442, 0, 971, 964, 992, 1442, - 0, 962, 0, 1442, 0, 1442, 0, 488, 921, 670, - 0, 717, 714, 0, 497, 715, 712, 569, 573, 1442, - 727, 0, 577, 726, 581, 1442, 585, 0, 590, 738, - 597, 0, 712, 683, 691, 0, 670, 1442, 1442, 623, - 1442, 591, 1442, 458, 702, 590, 0, 0, 0, 1442, - 0, 576, 569, 0, 1442, 593, 575, 0, 560, 546, - 567, 1442, 0, 0, 541, 529, 534, 527, 730, 1442, - 500, 0, 509, 1442, 0, 734, 1442, 468, 467, 0, - - 462, 704, 724, 1442, 461, 438, 1442, 440, 425, 433, - 405, 413, 398, 1442, 404, 1442, 359, 259, 332, 338, - 346, 334, 331, 257, 253, 226, 137, 133, 81, 0, - 0, 0, 0, 0, 0, 0, 0, 1442, 1442, 1442, - 753, 766, 779, 792, 805, 818, 831, 844, 857, 870, - 883, 896, 909, 922, 935, 948, 955, 967, 980, 986, - 998, 1011, 1024, 1037, 1050, 1063, 1070, 1082, 1089, 1101, - 1114, 1127, 1140, 1150, 1157, 1169, 1182, 1195, 1208, 1221, - 1234, 1241, 1253, 1266, 1279, 1282, 1284, 1296, 1309, 1315, - 1327, 1339, 1345, 1357, 1363, 1375, 1382, 1388, 1393, 1405, - - 1411, 1423, 1429 - } ; - -static const short int yy_def[404] = - { 0, - 340, 340, 341, 341, 342, 342, 343, 343, 340, 9, - 344, 344, 340, 13, 345, 345, 346, 346, 347, 347, - 348, 348, 349, 349, 340, 25, 350, 350, 345, 345, - 351, 351, 352, 352, 353, 353, 340, 37, 354, 354, - 37, 37, 355, 356, 340, 340, 340, 340, 340, 357, - 340, 340, 358, 359, 340, 360, 340, 340, 340, 340, - 340, 340, 340, 361, 362, 340, 340, 340, 340, 340, - 363, 364, 365, 340, 366, 340, 367, 367, 367, 366, - 368, 340, 340, 340, 340, 340, 340, 369, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 362, 340, 340, - - 370, 371, 340, 372, 362, 340, 373, 340, 340, 374, - 340, 375, 375, 375, 340, 340, 376, 340, 340, 340, - 377, 340, 340, 378, 340, 340, 379, 340, 340, 380, - 381, 381, 340, 381, 382, 382, 382, 383, 340, 340, - 383, 383, 340, 340, 340, 340, 384, 340, 340, 340, - 340, 384, 340, 340, 340, 357, 340, 340, 358, 340, - 340, 385, 340, 340, 386, 340, 340, 387, 388, 340, - 360, 340, 340, 340, 389, 340, 340, 361, 361, 340, - 340, 390, 391, 340, 391, 340, 340, 392, 340, 363, - 364, 340, 365, 340, 366, 367, 367, 367, 340, 368, - - 340, 340, 369, 340, 340, 340, 393, 340, 340, 340, - 373, 374, 340, 374, 340, 375, 375, 375, 376, 340, - 377, 394, 378, 340, 379, 340, 381, 381, 381, 340, - 382, 382, 382, 383, 340, 383, 383, 340, 340, 340, - 340, 395, 340, 340, 340, 340, 340, 385, 385, 396, - 340, 397, 396, 340, 340, 398, 388, 340, 340, 389, - 340, 340, 340, 361, 361, 340, 399, 391, 185, 340, - 392, 367, 367, 199, 340, 400, 340, 401, 375, 375, - 394, 340, 230, 402, 382, 382, 383, 383, 340, 340, - 340, 403, 396, 340, 397, 396, 340, 340, 340, 398, - - 340, 361, 265, 340, 367, 367, 340, 375, 375, 382, - 382, 383, 383, 340, 340, 340, 340, 361, 361, 367, - 367, 375, 375, 382, 382, 383, 383, 340, 340, 367, - 367, 375, 375, 382, 382, 383, 383, 340, 340, 0, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - - 340, 340, 340 - } ; - -static const short int yy_nxt[1486] = - { 0, - 46, 47, 48, 47, 47, 46, 46, 46, 49, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 46, 46, 46, 46, 51, 52, 51, 51, 46, 53, - 46, 54, 46, 46, 46, 46, 46, 55, 46, 46, - 46, 46, 46, 46, 46, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 46, 46, 46, 58, 59, 58, 58, - 60, 188, 61, 181, 181, 62, 62, 96, 339, 62, - - 97, 63, 85, 64, 65, 82, 83, 82, 82, 82, - 83, 82, 82, 104, 98, 119, 182, 182, 206, 105, - 106, 96, 91, 189, 97, 66, 62, 67, 68, 67, - 67, 60, 92, 61, 69, 93, 62, 62, 98, 85, - 62, 207, 63, 85, 64, 65, 85, 70, 176, 176, - 100, 176, 179, 263, 104, 120, 101, 100, 102, 338, - 105, 106, 94, 101, 337, 102, 66, 62, 75, 75, - 76, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - - 77, 77, 78, 77, 77, 77, 77, 79, 75, 75, - 75, 84, 84, 85, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 86, 84, 84, 84, 84, 87, 84, - 84, 84, 84, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 84, 84, 84, 91, 128, 122, 122, 129, 125, - 125, 213, 336, 181, 92, 123, 123, 93, 126, 126, - 128, 214, 130, 129, 144, 145, 144, 144, 179, 263, - 335, 146, 153, 154, 153, 153, 182, 130, 157, 158, - 157, 157, 147, 334, 94, 107, 107, 108, 107, 107, - - 109, 107, 107, 107, 110, 107, 107, 107, 107, 111, - 107, 107, 107, 107, 107, 107, 107, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, - 112, 112, 112, 112, 114, 115, 107, 116, 119, 139, - 140, 139, 139, 201, 241, 201, 201, 228, 241, 228, - 228, 179, 263, 235, 229, 235, 235, 238, 333, 238, - 238, 243, 254, 243, 243, 255, 247, 242, 247, 247, - 332, 242, 141, 331, 330, 244, 329, 142, 120, 131, - 132, 133, 132, 132, 131, 131, 131, 134, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - - 131, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 136, 135, 135, 135, 135, 137, 131, - 131, 131, 139, 140, 139, 139, 172, 173, 172, 172, - 213, 328, 327, 174, 186, 187, 186, 186, 326, 325, - 214, 174, 153, 154, 153, 153, 245, 246, 245, 245, - 157, 158, 157, 157, 249, 141, 249, 249, 324, 323, - 142, 149, 145, 149, 149, 322, 175, 251, 150, 251, - 251, 264, 321, 302, 175, 151, 178, 179, 263, 152, - 162, 245, 246, 245, 253, 201, 320, 201, 201, 228, - 317, 228, 228, 316, 265, 163, 229, 164, 235, 163, - - 235, 235, 163, 315, 163, 163, 164, 165, 166, 167, - 168, 294, 169, 183, 183, 240, 183, 183, 183, 183, - 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, - 183, 183, 183, 183, 183, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 183, 183, 183, 172, 173, 172, 172, - 313, 312, 311, 174, 186, 187, 186, 186, 310, 282, - 238, 174, 238, 238, 289, 290, 289, 289, 243, 309, - 243, 243, 245, 246, 245, 245, 247, 308, 247, 247, - 205, 249, 244, 249, 249, 275, 175, 269, 251, 269, - - 251, 251, 306, 305, 175, 180, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 301, 261, 270, 274, 274, 275, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 274, 274, 274, - 283, 283, 258, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 284, 284, 284, 284, 284, 284, 284, 284, - - 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, - 283, 283, 283, 296, 297, 296, 296, 303, 299, 318, - 298, 179, 263, 179, 263, 303, 303, 303, 303, 303, - 303, 289, 290, 289, 289, 296, 297, 296, 296, 319, - 294, 244, 291, 288, 287, 286, 285, 319, 319, 319, - 319, 319, 319, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 81, 81, 81, 81, 81, 81, 81, 81, - - 81, 81, 81, 81, 81, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 124, 124, 124, 124, - - 124, 124, 124, 124, 124, 124, 124, 124, 124, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 143, 143, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 156, 156, 230, 282, 156, 156, 159, 159, 159, - 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, - 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 171, 171, 220, 280, 171, 171, 178, 178, - - 279, 178, 178, 178, 178, 178, 178, 277, 178, 178, - 178, 180, 180, 204, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 190, 190, 190, 190, 190, 190, - 190, 190, 190, 190, 190, 190, 190, 192, 273, 272, - 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, - 193, 193, 193, 195, 195, 194, 195, 195, 195, 195, - 195, 195, 195, 191, 266, 195, 196, 196, 262, 261, - 196, 196, 200, 200, 259, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 203, 203, 258, 250, 203, - - 203, 205, 205, 160, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 208, 208, 244, 208, 208, 208, - 208, 208, 208, 208, 208, 208, 208, 210, 210, 239, - 210, 210, 210, 210, 210, 210, 239, 210, 210, 210, - 211, 211, 237, 236, 233, 211, 211, 211, 211, 211, - 212, 212, 232, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 212, 216, 216, 230, 224, 216, 216, 219, - 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, - 219, 219, 221, 221, 222, 221, 221, 220, 221, 221, - 221, 221, 221, 221, 221, 223, 223, 218, 223, 223, - - 217, 223, 223, 223, 223, 223, 223, 223, 225, 225, - 215, 209, 225, 225, 225, 225, 204, 225, 225, 225, - 225, 226, 226, 202, 226, 226, 226, 226, 226, 226, - 226, 226, 226, 226, 227, 227, 199, 227, 227, 227, - 227, 227, 227, 227, 198, 197, 227, 231, 231, 194, - 191, 231, 231, 234, 179, 177, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 240, 240, 170, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 248, - 248, 160, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 252, 252, 256, 256, 257, 257, 257, 257, - - 257, 257, 257, 257, 257, 257, 257, 257, 257, 260, - 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, - 260, 260, 267, 155, 340, 118, 267, 268, 268, 118, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 271, - 271, 89, 271, 271, 271, 271, 271, 271, 271, 271, - 271, 271, 278, 89, 80, 74, 278, 281, 281, 281, - 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, - 292, 74, 72, 72, 292, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 295, 295, - 340, 340, 295, 295, 300, 300, 340, 340, 300, 300, - - 304, 340, 340, 340, 304, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 307, 340, - 340, 340, 307, 284, 284, 340, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 314, 340, 340, 340, - 314, 45, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340 - } ; - -static const short int yy_chk[1486] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 69, 3, 65, 98, 3, 3, 19, 329, 3, - - 19, 3, 23, 3, 3, 11, 11, 11, 11, 12, - 12, 12, 12, 23, 19, 29, 65, 98, 101, 23, - 23, 20, 17, 69, 20, 3, 3, 4, 4, 4, - 4, 4, 17, 4, 4, 17, 4, 4, 20, 21, - 4, 101, 4, 24, 4, 4, 22, 4, 61, 61, - 21, 61, 178, 178, 24, 29, 21, 22, 21, 328, - 24, 24, 17, 22, 327, 22, 4, 4, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 18, 35, 31, 32, 35, 33, - 34, 110, 326, 105, 18, 31, 32, 18, 33, 34, - 36, 110, 35, 36, 43, 43, 43, 43, 318, 318, - 325, 43, 47, 47, 47, 47, 105, 36, 51, 51, - 51, 51, 43, 324, 18, 25, 25, 25, 25, 25, - - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 30, 39, - 39, 39, 39, 82, 147, 82, 82, 132, 152, 132, - 132, 319, 319, 139, 132, 139, 139, 144, 323, 144, - 144, 149, 167, 149, 149, 167, 161, 147, 161, 161, - 322, 152, 39, 321, 320, 149, 317, 39, 30, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 40, 40, 40, 40, 58, 58, 58, 58, - 212, 315, 313, 58, 67, 67, 67, 67, 312, 311, - 212, 67, 153, 153, 153, 153, 155, 155, 155, 155, - 157, 157, 157, 157, 162, 40, 162, 162, 310, 309, - 40, 44, 44, 44, 44, 308, 58, 164, 44, 164, - 164, 179, 306, 264, 67, 44, 179, 264, 264, 44, - 54, 166, 166, 166, 166, 201, 305, 201, 201, 228, - 301, 228, 228, 299, 179, 54, 228, 54, 235, 54, - - 235, 235, 54, 298, 54, 54, 54, 54, 54, 54, - 54, 293, 54, 66, 66, 291, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 172, 172, 172, 172, - 288, 287, 286, 172, 186, 186, 186, 186, 285, 281, - 238, 186, 238, 238, 239, 239, 239, 239, 243, 280, - 243, 243, 245, 245, 245, 245, 247, 279, 247, 247, - 277, 249, 243, 249, 249, 276, 172, 185, 251, 185, - - 251, 251, 273, 272, 186, 266, 185, 185, 185, 185, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 262, 260, 185, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 230, 230, 257, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 253, 253, 253, 253, 265, 255, 302, - 254, 265, 265, 302, 302, 265, 265, 265, 265, 265, - 265, 289, 289, 289, 289, 296, 296, 296, 296, 303, - 250, 244, 241, 237, 236, 233, 232, 303, 303, 303, - 303, 303, 303, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, 342, 343, - 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 344, 344, 344, 344, 344, 344, 344, 344, - - 344, 344, 344, 344, 344, 345, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 345, 346, 346, - 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, - 346, 347, 347, 347, 347, 347, 347, 347, 347, 347, - 347, 347, 347, 347, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, - 350, 350, 350, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 352, 352, 352, 352, - - 352, 352, 352, 352, 352, 352, 352, 352, 352, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 354, 354, 354, 354, 354, 354, 354, 354, - 354, 354, 354, 354, 354, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 356, 356, - 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, - 356, 357, 357, 229, 222, 357, 357, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, - 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, - 359, 359, 360, 360, 219, 218, 360, 360, 361, 361, - - 217, 361, 361, 361, 361, 361, 361, 206, 361, 361, - 361, 362, 362, 204, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 364, 198, 197, - 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, - 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, - 365, 365, 365, 366, 366, 193, 366, 366, 366, 366, - 366, 366, 366, 190, 181, 366, 367, 367, 177, 175, - 367, 367, 368, 368, 174, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 369, 369, 169, 163, 369, - - 369, 370, 370, 159, 370, 370, 370, 370, 370, 370, - 370, 370, 370, 370, 371, 371, 151, 371, 371, 371, - 371, 371, 371, 371, 371, 371, 371, 372, 372, 150, - 372, 372, 372, 372, 372, 372, 146, 372, 372, 372, - 373, 373, 142, 141, 137, 373, 373, 373, 373, 373, - 374, 374, 136, 374, 374, 374, 374, 374, 374, 374, - 374, 374, 374, 375, 375, 134, 126, 375, 375, 376, - 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, - 376, 376, 377, 377, 123, 377, 377, 117, 377, 377, - 377, 377, 377, 377, 377, 378, 378, 114, 378, 378, - - 113, 378, 378, 378, 378, 378, 378, 378, 379, 379, - 111, 102, 379, 379, 379, 379, 93, 379, 379, 379, - 379, 380, 380, 87, 380, 380, 380, 380, 380, 380, - 380, 380, 380, 380, 381, 381, 80, 381, 381, 381, - 381, 381, 381, 381, 79, 78, 381, 382, 382, 73, - 71, 382, 382, 383, 64, 63, 383, 383, 383, 383, - 383, 383, 383, 383, 383, 383, 384, 384, 55, 384, - 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, - 385, 53, 385, 385, 385, 385, 385, 385, 385, 385, - 385, 385, 386, 386, 387, 387, 388, 388, 388, 388, - - 388, 388, 388, 388, 388, 388, 388, 388, 388, 389, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, - 389, 389, 390, 49, 45, 28, 390, 391, 391, 27, - 391, 391, 391, 391, 391, 391, 391, 391, 391, 392, - 392, 16, 392, 392, 392, 392, 392, 392, 392, 392, - 392, 392, 393, 15, 10, 8, 393, 394, 394, 394, - 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, - 395, 7, 6, 5, 395, 396, 396, 396, 396, 396, - 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, - 0, 0, 397, 397, 398, 398, 0, 0, 398, 398, - - 399, 0, 0, 0, 399, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 401, 0, - 0, 0, 401, 402, 402, 0, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 402, 403, 0, 0, 0, - 403, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340 - } ; - -static yy_state_type yy_last_accepting_state; -static YY_CHAR *yy_last_accepting_cpos; - -/* the intent behind this definition is that it'll catch - * any uses of REJECT which flex missed - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 - -/* these variables are all declared out here so that section 3 code can - * manipulate them - */ -/* points to current character in buffer */ -static YY_CHAR *yy_c_buf_p = (YY_CHAR *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yyunput YY_PROTO(( YY_CHAR c, YY_CHAR *buf_ptr )); -void yyrestart YY_PROTO(( FILE *input_file )); -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); - -#define yy_new_buffer yy_create_buffer - -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif - -YY_DECL - { - register yy_state_type yy_current_state; - register YY_CHAR *yy_cp, *yy_bp; - register int yy_act; - - - static int bracelevel, didadef; - int i, indented_code, checking_used, new_xlation; - int doing_codeblock = false; - Char nmdef[MAXLINE], myesc(); - - - if ( yy_init ) - { - YY_USER_INIT; - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( yy_current_buffer ) - yy_init_buffer( yy_current_buffer, yyin ); - else - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - - yy_init = 0; - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = yy_c_buf_p; - - /* support of yytext */ - *yy_cp = yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of the - * current run. - */ - yy_bp = yy_cp; - - yy_current_state = yy_start; - if ( yy_bp[-1] == '\n' ) - ++yy_current_state; -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[*yy_cp]; - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = yy_def[yy_current_state]; - if ( yy_current_state >= 341 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - ++yy_cp; - } - while ( yy_current_state != 340 ); - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - - YY_DO_BEFORE_ACTION; - YY_USER_ACTION; - -do_action: /* this label is used only to access EOF actions */ - - - switch ( yy_act ) - { - case 0: /* must backtrack */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yy_hold_char; - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - goto yy_find_action; - -case 1: -# line 90 "scan.l" -indented_code = true; BEGIN(CODEBLOCK); - YY_BREAK -case 2: -# line 91 "scan.l" -++linenum; /* treat as a comment */ - YY_BREAK -case 3: -# line 92 "scan.l" -ECHO; BEGIN(C_COMMENT); - YY_BREAK -case 4: -# line 93 "scan.l" -return ( SCDECL ); - YY_BREAK -case 5: -# line 94 "scan.l" -return ( XSCDECL ); - YY_BREAK -case 6: -# line 95 "scan.l" -{ - ++linenum; - line_directive_out( stdout ); - indented_code = false; - BEGIN(CODEBLOCK); - } - YY_BREAK -case 7: -# line 102 "scan.l" -return ( WHITESPACE ); - YY_BREAK -case 8: -# line 104 "scan.l" -{ - sectnum = 2; - line_directive_out( stdout ); - BEGIN(SECT2PROLOG); - return ( SECTEND ); - } - YY_BREAK -case 9: -# line 111 "scan.l" -{ - pinpoint_message( "warning - %%used/%%unused have been deprecated" ); - checking_used = REALLY_USED; BEGIN(USED_LIST); - } - YY_BREAK -case 10: -# line 115 "scan.l" -{ - checking_used = REALLY_NOT_USED; BEGIN(USED_LIST); - pinpoint_message( "warning - %%used/%%unused have been deprecated" ); - checking_used = REALLY_NOT_USED; BEGIN(USED_LIST); - } - YY_BREAK -case 11: -# line 122 "scan.l" -{ -#ifdef NOTDEF - fprintf( stderr, - "old-style lex command at line %d ignored:\n\t%s", - linenum, yytext ); -#endif - ++linenum; - } - YY_BREAK -case 12: -# line 131 "scan.l" -/* ignore old lex directive */ - YY_BREAK -case 13: -# line 133 "scan.l" -{ - ++linenum; - xlation = - (int *) malloc( sizeof( int ) * (unsigned) csize ); - - if ( ! xlation ) - flexfatal( - "dynamic memory failure building %t table" ); - - for ( i = 0; i < csize; ++i ) - xlation[i] = 0; - - num_xlations = 0; - - BEGIN(XLATION); - } - YY_BREAK -case 14: -# line 150 "scan.l" -synerr( "unrecognized '%' directive" ); - YY_BREAK -case 15: -# line 152 "scan.l" -{ - (void) strcpy( nmstr, (char *) yytext ); - didadef = false; - BEGIN(PICKUPDEF); - } - YY_BREAK -case 16: -# line 158 "scan.l" -RETURNNAME; - YY_BREAK -case 17: -# line 159 "scan.l" -++linenum; /* allows blank lines in section 1 */ - YY_BREAK -case 18: -# line 160 "scan.l" -++linenum; return ( '\n' ); - YY_BREAK -case 19: -# line 161 "scan.l" -synerr( "illegal character" ); BEGIN(RECOVER); - YY_BREAK -case 20: -# line 164 "scan.l" -ECHO; BEGIN(INITIAL); - YY_BREAK -case 21: -# line 165 "scan.l" -++linenum; ECHO; BEGIN(INITIAL); - YY_BREAK -case 22: -# line 166 "scan.l" -ECHO; - YY_BREAK -case 23: -# line 167 "scan.l" -ECHO; - YY_BREAK -case 24: -# line 168 "scan.l" -++linenum; ECHO; - YY_BREAK -case 25: -# line 171 "scan.l" -++linenum; BEGIN(INITIAL); - YY_BREAK -case 26: -# line 172 "scan.l" -ECHO; CHECK_REJECT(yytext); - YY_BREAK -case 27: -# line 173 "scan.l" -ECHO; CHECK_YYMORE(yytext); - YY_BREAK -case 28: -# line 174 "scan.l" -ECHO; - YY_BREAK -case 29: -# line 175 "scan.l" -{ - ++linenum; - ECHO; - if ( indented_code ) - BEGIN(INITIAL); - } - YY_BREAK -case 30: -# line 183 "scan.l" -/* separates name and definition */ - YY_BREAK -case 31: -# line 185 "scan.l" -{ - (void) strcpy( (char *) nmdef, (char *) yytext ); - - for ( i = strlen( (char *) nmdef ) - 1; - i >= 0 && - nmdef[i] == ' ' || nmdef[i] == '\t'; - --i ) - ; - - nmdef[i + 1] = '\0'; - - ndinstal( nmstr, nmdef ); - didadef = true; - } - YY_BREAK -case 32: -# line 200 "scan.l" -{ - if ( ! didadef ) - synerr( "incomplete name definition" ); - BEGIN(INITIAL); - ++linenum; - } - YY_BREAK -case 33: -# line 207 "scan.l" -++linenum; BEGIN(INITIAL); RETURNNAME; - YY_BREAK -case 34: -# line 210 "scan.l" -++linenum; BEGIN(INITIAL); - YY_BREAK -case 35: -# line 211 "scan.l" - - YY_BREAK -case 36: -# line 212 "scan.l" -{ - if ( all_upper( yytext ) ) - reject_really_used = checking_used; - else - synerr( "unrecognized %used/%unused construct" ); - } - YY_BREAK -case 37: -# line 218 "scan.l" -{ - if ( all_lower( yytext ) ) - yymore_really_used = checking_used; - else - synerr( "unrecognized %used/%unused construct" ); - } - YY_BREAK -case 38: -# line 224 "scan.l" -synerr( "unrecognized %used/%unused construct" ); - YY_BREAK -case 39: -# line 227 "scan.l" -++linenum; BEGIN(INITIAL); - YY_BREAK -case 40: -# line 228 "scan.l" -++num_xlations; new_xlation = true; - YY_BREAK -case 41: -# line 229 "scan.l" -synerr( "bad row in translation table" ); - YY_BREAK -case 42: -# line 230 "scan.l" -/* ignore whitespace */ - YY_BREAK -case 43: -# line 232 "scan.l" -{ - xlation[myesc( yytext )] = - (new_xlation ? num_xlations : -num_xlations); - new_xlation = false; - } - YY_BREAK -case 44: -# line 237 "scan.l" -{ - xlation[yytext[0]] = - (new_xlation ? num_xlations : -num_xlations); - new_xlation = false; - } - YY_BREAK -case 45: -# line 243 "scan.l" -++linenum; - YY_BREAK -case 46: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -# line 246 "scan.l" -{ - ++linenum; - ACTION_ECHO; - MARK_END_OF_PROLOG; - BEGIN(SECT2); - } - YY_BREAK -case 47: -# line 253 "scan.l" -++linenum; ACTION_ECHO; - YY_BREAK -case YY_STATE_EOF(SECT2PROLOG): -# line 255 "scan.l" -MARK_END_OF_PROLOG; yyterminate(); - YY_BREAK -case 49: -# line 257 "scan.l" -++linenum; /* allow blank lines in section 2 */ - YY_BREAK -case 50: -# line 259 "scan.l" -{ - indented_code = (yytext[0] != '%'); - doing_codeblock = true; - bracelevel = 1; - - if ( indented_code ) - ACTION_ECHO; - - BEGIN(CODEBLOCK_2); - } - YY_BREAK -case 51: -# line 270 "scan.l" -BEGIN(SC); return ( '<' ); - YY_BREAK -case 52: -# line 271 "scan.l" -return ( '^' ); - YY_BREAK -case 53: -# line 272 "scan.l" -BEGIN(QUOTE); return ( '"' ); - YY_BREAK -case 54: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -# line 273 "scan.l" -BEGIN(NUM); return ( '{' ); - YY_BREAK -case 55: -# line 274 "scan.l" -BEGIN(BRACEERROR); - YY_BREAK -case 56: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -# line 275 "scan.l" -return ( '$' ); - YY_BREAK -case 57: -# line 277 "scan.l" -{ - bracelevel = 1; - BEGIN(PERCENT_BRACE_ACTION); - return ( '\n' ); - } - YY_BREAK -case 58: -# line 282 "scan.l" -continued_action = true; ++linenum; return ( '\n' ); - YY_BREAK -case 59: -# line 284 "scan.l" -{ - /* this rule is separate from the one below because - * otherwise we get variable trailing context, so - * we can't build the scanner using -{f,F} - */ - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); - return ( '\n' ); - } - YY_BREAK -case 60: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -# line 295 "scan.l" -{ - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); - return ( '\n' ); - } - YY_BREAK -case 61: -# line 302 "scan.l" -++linenum; return ( '\n' ); - YY_BREAK -case 62: -# line 304 "scan.l" -return ( EOF_OP ); - YY_BREAK -case 63: -# line 306 "scan.l" -{ - sectnum = 3; - BEGIN(SECT3); - return ( EOF ); /* to stop the parser */ - } - YY_BREAK -case 64: -# line 312 "scan.l" -{ - int cclval; - - (void) strcpy( nmstr, (char *) yytext ); - - /* check to see if we've already encountered this ccl */ - if ( (cclval = ccllookup( (Char *) nmstr )) ) - { - yylval = cclval; - ++cclreuse; - return ( PREVCCL ); - } - else - { - /* we fudge a bit. We know that this ccl will - * soon be numbered as lastccl + 1 by cclinit - */ - cclinstal( (Char *) nmstr, lastccl + 1 ); - - /* push back everything but the leading bracket - * so the ccl can be rescanned - */ - PUT_BACK_STRING((Char *) nmstr, 1); - - BEGIN(FIRSTCCL); - return ( '[' ); - } - } - YY_BREAK -case 65: -# line 341 "scan.l" -{ - register Char *nmdefptr; - Char *ndlookup(); - - (void) strcpy( nmstr, (char *) yytext ); - nmstr[yyleng - 1] = '\0'; /* chop trailing brace */ - - /* lookup from "nmstr + 1" to chop leading brace */ - if ( ! (nmdefptr = ndlookup( nmstr + 1 )) ) - synerr( "undefined {name}" ); - - else - { /* push back name surrounded by ()'s */ - unput(')'); - PUT_BACK_STRING(nmdefptr, 0); - unput('('); - } - } - YY_BREAK -case 66: -# line 360 "scan.l" -return ( yytext[0] ); - YY_BREAK -case 67: -# line 361 "scan.l" -RETURNCHAR; - YY_BREAK -case 68: -# line 362 "scan.l" -++linenum; return ( '\n' ); - YY_BREAK -case 69: -# line 365 "scan.l" -return ( ',' ); - YY_BREAK -case 70: -# line 366 "scan.l" -BEGIN(SECT2); return ( '>' ); - YY_BREAK -case 71: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -# line 367 "scan.l" -BEGIN(CARETISBOL); return ( '>' ); - YY_BREAK -case 72: -# line 368 "scan.l" -RETURNNAME; - YY_BREAK -case 73: -# line 369 "scan.l" -synerr( "bad start condition name" ); - YY_BREAK -case 74: -# line 371 "scan.l" -BEGIN(SECT2); return ( '^' ); - YY_BREAK -case 75: -# line 374 "scan.l" -RETURNCHAR; - YY_BREAK -case 76: -# line 375 "scan.l" -BEGIN(SECT2); return ( '"' ); - YY_BREAK -case 77: -# line 377 "scan.l" -{ - synerr( "missing quote" ); - BEGIN(SECT2); - ++linenum; - return ( '"' ); - } - YY_BREAK -case 78: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -# line 385 "scan.l" -BEGIN(CCL); return ( '^' ); - YY_BREAK -case 79: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -# line 386 "scan.l" -return ( '^' ); - YY_BREAK -case 80: -# line 387 "scan.l" -BEGIN(CCL); yylval = '-'; return ( CHAR ); - YY_BREAK -case 81: -# line 388 "scan.l" -BEGIN(CCL); RETURNCHAR; - YY_BREAK -case 82: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -# line 390 "scan.l" -return ( '-' ); - YY_BREAK -case 83: -# line 391 "scan.l" -RETURNCHAR; - YY_BREAK -case 84: -# line 392 "scan.l" -BEGIN(SECT2); return ( ']' ); - YY_BREAK -case 85: -# line 395 "scan.l" -{ - yylval = myctoi( yytext ); - return ( NUMBER ); - } - YY_BREAK -case 86: -# line 400 "scan.l" -return ( ',' ); - YY_BREAK -case 87: -# line 401 "scan.l" -BEGIN(SECT2); return ( '}' ); - YY_BREAK -case 88: -# line 403 "scan.l" -{ - synerr( "bad character inside {}'s" ); - BEGIN(SECT2); - return ( '}' ); - } - YY_BREAK -case 89: -# line 409 "scan.l" -{ - synerr( "missing }" ); - BEGIN(SECT2); - ++linenum; - return ( '}' ); - } - YY_BREAK -case 90: -# line 417 "scan.l" -synerr( "bad name in {}'s" ); BEGIN(SECT2); - YY_BREAK -case 91: -# line 418 "scan.l" -synerr( "missing }" ); ++linenum; BEGIN(SECT2); - YY_BREAK -case 92: -# line 421 "scan.l" -bracelevel = 0; - YY_BREAK -case 93: -# line 422 "scan.l" -{ - ACTION_ECHO; - CHECK_REJECT(yytext); - } - YY_BREAK -case 94: -# line 426 "scan.l" -{ - ACTION_ECHO; - CHECK_YYMORE(yytext); - } - YY_BREAK -case 95: -# line 430 "scan.l" -ACTION_ECHO; - YY_BREAK -case 96: -# line 431 "scan.l" -{ - ++linenum; - ACTION_ECHO; - if ( bracelevel == 0 || - (doing_codeblock && indented_code) ) - { - if ( ! doing_codeblock ) - fputs( "\tYY_BREAK\n", temp_action_file ); - - doing_codeblock = false; - BEGIN(SECT2); - } - } - YY_BREAK - /* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */ -case 97: -# line 447 "scan.l" -ACTION_ECHO; ++bracelevel; - YY_BREAK -case 98: -# line 448 "scan.l" -ACTION_ECHO; --bracelevel; - YY_BREAK -case 99: -# line 449 "scan.l" -ACTION_ECHO; - YY_BREAK -case 100: -# line 450 "scan.l" -ACTION_ECHO; - YY_BREAK -case 101: -# line 451 "scan.l" -ACTION_ECHO; BEGIN(ACTION_COMMENT); - YY_BREAK -case 102: -# line 452 "scan.l" -ACTION_ECHO; /* character constant */ - YY_BREAK -case 103: -# line 453 "scan.l" -ACTION_ECHO; BEGIN(ACTION_STRING); - YY_BREAK -case 104: -# line 454 "scan.l" -{ - ++linenum; - ACTION_ECHO; - if ( bracelevel == 0 ) - { - fputs( "\tYY_BREAK\n", temp_action_file ); - BEGIN(SECT2); - } - } - YY_BREAK -case 105: -# line 463 "scan.l" -ACTION_ECHO; - YY_BREAK -case 106: -# line 465 "scan.l" -ACTION_ECHO; BEGIN(ACTION); - YY_BREAK -case 107: -# line 466 "scan.l" -ACTION_ECHO; - YY_BREAK -case 108: -# line 467 "scan.l" -ACTION_ECHO; - YY_BREAK -case 109: -# line 468 "scan.l" -++linenum; ACTION_ECHO; - YY_BREAK -case 110: -# line 469 "scan.l" -ACTION_ECHO; - YY_BREAK -case 111: -# line 471 "scan.l" -ACTION_ECHO; - YY_BREAK -case 112: -# line 472 "scan.l" -ACTION_ECHO; - YY_BREAK -case 113: -# line 473 "scan.l" -++linenum; ACTION_ECHO; - YY_BREAK -case 114: -# line 474 "scan.l" -ACTION_ECHO; BEGIN(ACTION); - YY_BREAK -case 115: -# line 475 "scan.l" -ACTION_ECHO; - YY_BREAK -case YY_STATE_EOF(ACTION): -case YY_STATE_EOF(ACTION_COMMENT): -case YY_STATE_EOF(ACTION_STRING): -# line 477 "scan.l" -{ - synerr( "EOF encountered inside an action" ); - yyterminate(); - } - YY_BREAK -case 117: -# line 483 "scan.l" -{ - yylval = myesc( yytext ); - return ( CHAR ); - } - YY_BREAK -case 118: -# line 488 "scan.l" -{ - yylval = myesc( yytext ); - BEGIN(CCL); - return ( CHAR ); - } - YY_BREAK -case 119: -# line 495 "scan.l" -ECHO; - YY_BREAK -case 120: -# line 496 "scan.l" -YY_FATAL_ERROR( "flex scanner jammed" ); - YY_BREAK -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(SECT2): -case YY_STATE_EOF(SECT3): -case YY_STATE_EOF(CODEBLOCK): -case YY_STATE_EOF(PICKUPDEF): -case YY_STATE_EOF(SC): -case YY_STATE_EOF(CARETISBOL): -case YY_STATE_EOF(NUM): -case YY_STATE_EOF(QUOTE): -case YY_STATE_EOF(FIRSTCCL): -case YY_STATE_EOF(CCL): -case YY_STATE_EOF(RECOVER): -case YY_STATE_EOF(BRACEERROR): -case YY_STATE_EOF(C_COMMENT): -case YY_STATE_EOF(PERCENT_BRACE_ACTION): -case YY_STATE_EOF(USED_LIST): -case YY_STATE_EOF(CODEBLOCK_2): -case YY_STATE_EOF(XLATION): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* amount of text matched not including the EOB char */ - int yy_amount_of_matched_text = yy_cp - yytext - 1; - - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yy_hold_char; - - /* note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the end- - * of-buffer state). Contrast this with the test in yyinput(). - */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* this was really a NUL */ - { - yy_state_type yy_next_state; - - yy_c_buf_p = yytext + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - /* okay, we're now positioned to make the - * NUL transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we - * don't want to build jamming into it because - * then it will run more slowly) - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = yytext + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* consume the NUL */ - yy_cp = ++yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* note: because we've taken care in - * yy_get_next_buffer() to have set up yytext, - * we can now set up yy_c_buf_p so that if some - * total hoser (like flex itself) wants - * to call the scanner after we return the - * YY_NULL, it'll still work - another YY_NULL - * will get returned. - */ - yy_c_buf_p = yytext + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF((yy_start - 1) / 2); - goto do_action; - } - - else - { - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - } - break; - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: -#ifdef FLEX_DEBUG - printf( "action # %d\n", yy_act ); -#endif - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } - } - } - - -/* yy_get_next_buffer - try to read in a new buffer - * - * synopsis - * int yy_get_next_buffer(); - * - * returns a code representing an action - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ - -static int yy_get_next_buffer() - - { - register YY_CHAR *dest = yy_current_buffer->yy_ch_buf; - register YY_CHAR *source = yytext - 1; /* copy prev. char, too */ - register int number_to_move, i; - int ret_val; - - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - /* try to read more data */ - - /* first move last chars to start of buffer */ - number_to_move = yy_c_buf_p - yytext; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( yy_current_buffer->yy_eof_status != EOF_NOT_SEEN ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - yy_n_chars = 0; - - else - { - int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - else if ( num_to_read <= 0 ) - YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); - - /* read in more data */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - } - - if ( yy_n_chars == 0 ) - { - if ( number_to_move == 1 ) - { - ret_val = EOB_ACT_END_OF_FILE; - yy_current_buffer->yy_eof_status = EOF_DONE; - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_eof_status = EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - /* yytext begins at the second character in yy_ch_buf; the first - * character is the one which preceded it before reading in the latest - * buffer; it needs to be kept around in case it's a newline, so - * yy_get_previous_state() will have with '^' rules active - */ - - yytext = &yy_current_buffer->yy_ch_buf[1]; - - return ( ret_val ); - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached - * - * synopsis - * yy_state_type yy_get_previous_state(); - */ - -static yy_state_type yy_get_previous_state() - - { - register yy_state_type yy_current_state; - register YY_CHAR *yy_cp; - - register YY_CHAR *yy_bp = yytext; - - yy_current_state = yy_start; - if ( yy_bp[-1] == '\n' ) - ++yy_current_state; - - for ( yy_cp = yytext + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[*yy_cp] : 1); - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = yy_def[yy_current_state]; - if ( yy_current_state >= 341 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - } - - return ( yy_current_state ); - } - - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( register yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -register yy_state_type yy_current_state; -#endif - - { - register int yy_is_jam; - register YY_CHAR *yy_cp = yy_c_buf_p; - - register YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = yy_def[yy_current_state]; - if ( yy_current_state >= 341 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 340); - - return ( yy_is_jam ? 0 : yy_current_state ); - } - - -#ifdef YY_USE_PROTOS -static void yyunput( YY_CHAR c, register YY_CHAR *yy_bp ) -#else -static void yyunput( c, yy_bp ) -YY_CHAR c; -register YY_CHAR *yy_bp; -#endif - - { - register YY_CHAR *yy_cp = yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - register int number_to_move = yy_n_chars + 2; /* +2 for EOB chars */ - register YY_CHAR *dest = - &yy_current_buffer->yy_ch_buf[yy_current_buffer->yy_buf_size + 2]; - register YY_CHAR *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; - - while ( source > yy_current_buffer->yy_ch_buf ) - *--dest = *--source; - - yy_cp += dest - source; - yy_bp += dest - source; - yy_n_chars = yy_current_buffer->yy_buf_size; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - if ( yy_cp > yy_bp && yy_cp[-1] == '\n' ) - yy_cp[-2] = '\n'; - - *--yy_cp = c; - - /* note: the formal parameter *must* be called "yy_bp" for this - * macro to now work correctly - */ - YY_DO_BEFORE_ACTION; /* set up yytext again */ - } - - -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif - - { - int c; - YY_CHAR *yy_cp = yy_c_buf_p; - - *yy_cp = yy_hold_char; - - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* this was really a NUL */ - *yy_c_buf_p = '\0'; - - else - { /* need more input */ - yytext = yy_c_buf_p; - ++yy_c_buf_p; - - switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - { - yy_c_buf_p = yytext + YY_MORE_ADJ; - return ( EOF ); - } - - YY_NEW_FILE; - -#ifdef __cplusplus - return ( yyinput() ); -#else - return ( input() ); -#endif - } - break; - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext + YY_MORE_ADJ; - break; - - case EOB_ACT_LAST_MATCH: -#ifdef __cplusplus - YY_FATAL_ERROR( "unexpected last match in yyinput()" ); -#else - YY_FATAL_ERROR( "unexpected last match in input()" ); -#endif - } - } - } - - c = *yy_c_buf_p; - yy_hold_char = *++yy_c_buf_p; - - return ( c ); - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - - { - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - - { - if ( yy_current_buffer == new_buffer ) - return; - - if ( yy_current_buffer ) - { - /* flush out information for old buffer */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* we don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) malloc( sizeof( struct yy_buffer_state ) ); - - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (YY_CHAR *) malloc( (unsigned) (b->yy_buf_size + 2) ); - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - yy_init_buffer( b, file ); - - return ( b ); - } - - -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - - { - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - free( (char *) b->yy_ch_buf ); - free( (char *) b ); - } - - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - - { - b->yy_input_file = file; - - /* we put in the '\n' and start reading from [1] so that an - * initial match-at-newline will be true. - */ - - b->yy_ch_buf[0] = '\n'; - b->yy_n_chars = 1; - - /* we always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[1]; - - b->yy_eof_status = EOF_NOT_SEEN; - } -# line 496 "scan.l" - - - -int yywrap() - - { - if ( --num_input_files > 0 ) - { - set_input_file( *++input_files ); - return ( 0 ); - } - - else - return ( 1 ); - } - - -/* set_input_file - open the given file (if NULL, stdin) for scanning */ - -void set_input_file( file ) -char *file; - - { - if ( file ) - { - infilename = file; - yyin = fopen( infilename, "r" ); - - if ( yyin == NULL ) - lerrsf( "can't open %s", file ); - } - - else - { - yyin = stdin; - infilename = ""; - } - } diff --git a/util/flex/libmain.c b/util/flex/libmain.c deleted file mode 100644 index 69a9ab151..000000000 --- a/util/flex/libmain.c +++ /dev/null @@ -1,13 +0,0 @@ -/* libmain - flex run-time support library "main" function */ - -/* $Id$ */ - -extern int yylex(); - -int main( argc, argv ) -int argc; -char *argv[]; - - { - return yylex(); - } diff --git a/util/flex/main.c b/util/flex/main.c deleted file mode 100644 index d6f0ec936..000000000 --- a/util/flex/main.c +++ /dev/null @@ -1,770 +0,0 @@ -/* flex - tool to generate fast lexical analyzers */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -char copyright[] = -"@(#) Copyright (c) 1990 The Regents of the University of California.\n\ - All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - - -#include -#include "flexdef.h" - -static char flex_version[] = "2.3"; - - -/* declare functions that have forward references */ - -void flexinit PROTO((int, char**)); -void readin PROTO(()); -void set_up_initial_allocations PROTO(()); - - -/* these globals are all defined and commented in flexdef.h */ -int printstats, syntaxerror, eofseen, ddebug, trace, spprdflt; -int interactive, caseins, useecs, fulltbl, usemecs; -int fullspd, gen_line_dirs, performance_report, backtrack_report, csize; -int yymore_used, reject, real_reject, continued_action; -int yymore_really_used, reject_really_used; -int datapos, dataline, linenum; -FILE *skelfile = NULL; -char *infilename = NULL; -int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE]; -int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp; -int current_mns, num_rules, current_max_rules, lastnfa; -int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2; -int *accptnum, *assoc_rule, *state_type, *rule_type, *rule_linenum; -int current_state_type; -int variable_trailing_context_rules; -int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP]; -int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE]; -int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs, tecfwd[CSIZE + 1]; -int tecbck[CSIZE + 1]; -int *xlation = (int *) 0; -int num_xlations; -int lastsc, current_max_scs, *scset, *scbol, *scxclu, *sceof, *actvsc; -char **scname; -int current_max_dfa_size, current_max_xpairs; -int current_max_template_xpairs, current_max_dfas; -int lastdfa, *nxt, *chk, *tnxt; -int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz; -union dfaacc_union *dfaacc; -int *accsiz, *dhash, numas; -int numsnpairs, jambase, jamstate; -int lastccl, current_maxccls, *cclmap, *ccllen, *cclng, cclreuse; -int current_max_ccl_tbl_size; -Char *ccltbl; -char *starttime, *endtime, nmstr[MAXLINE]; -int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs; -int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave; -int num_backtracking, bol_needed; -FILE *temp_action_file; -FILE *backtrack_file; -int end_of_buffer_state; -char *action_file_name = NULL; -char **input_files; -int num_input_files; -char *program_name; - -#ifndef SHORT_FILE_NAMES -static char *outfile = "lex.yy.c"; -#else -static char *outfile = "lexyy.c"; -#endif -static int outfile_created = 0; -static int use_stdout; -static char *skelname = NULL; - - -int main( argc, argv ) -int argc; -char **argv; - - { - flexinit( argc, argv ); - - readin(); - - if ( syntaxerror ) - flexend( 1 ); - - if ( yymore_really_used == REALLY_USED ) - yymore_used = true; - else if ( yymore_really_used == REALLY_NOT_USED ) - yymore_used = false; - - if ( reject_really_used == REALLY_USED ) - reject = true; - else if ( reject_really_used == REALLY_NOT_USED ) - reject = false; - - if ( performance_report ) - { - if ( interactive ) - fprintf( stderr, - "-I (interactive) entails a minor performance penalty\n" ); - - if ( yymore_used ) - fprintf( stderr, "yymore() entails a minor performance penalty\n" ); - - if ( reject ) - fprintf( stderr, "REJECT entails a large performance penalty\n" ); - - if ( variable_trailing_context_rules ) - fprintf( stderr, -"Variable trailing context rules entail a large performance penalty\n" ); - } - - if ( reject ) - real_reject = true; - - if ( variable_trailing_context_rules ) - reject = true; - - if ( (fulltbl || fullspd) && reject ) - { - if ( real_reject ) - flexerror( "REJECT cannot be used with -f or -F" ); - else - flexerror( - "variable trailing context rules cannot be used with -f or -F" ); - } - - ntod(); - - /* generate the C state transition tables from the DFA */ - make_tables(); - - /* note, flexend does not return. It exits with its argument as status. */ - - flexend( 0 ); - - /*NOTREACHED*/ - } - - -/* flexend - terminate flex - * - * synopsis - * int status; - * flexend( status ); - * - * status is exit status. - * - * note - * This routine does not return. - */ - -void flexend( status ) -int status; - - { - int tblsiz; - char *flex_gettime(); - - if ( skelfile != NULL ) - { - if ( ferror( skelfile ) ) - flexfatal( "error occurred when writing skeleton file" ); - - else if ( fclose( skelfile ) ) - flexfatal( "error occurred when closing skeleton file" ); - } - - if ( temp_action_file ) - { - if ( ferror( temp_action_file ) ) - flexfatal( "error occurred when writing temporary action file" ); - - else if ( fclose( temp_action_file ) ) - flexfatal( "error occurred when closing temporary action file" ); - - else if ( unlink( action_file_name ) ) - flexfatal( "error occurred when deleting temporary action file" ); - } - - if ( status != 0 && outfile_created ) - { - if ( ferror( stdout ) ) - flexfatal( "error occurred when writing output file" ); - - else if ( fclose( stdout ) ) - flexfatal( "error occurred when closing output file" ); - - else if ( unlink( outfile ) ) - flexfatal( "error occurred when deleting output file" ); - } - - if ( backtrack_report && backtrack_file ) - { - if ( num_backtracking == 0 ) - fprintf( backtrack_file, "No backtracking.\n" ); - else if ( fullspd || fulltbl ) - fprintf( backtrack_file, - "%d backtracking (non-accepting) states.\n", - num_backtracking ); - else - fprintf( backtrack_file, "Compressed tables always backtrack.\n" ); - - if ( ferror( backtrack_file ) ) - flexfatal( "error occurred when writing backtracking file" ); - - else if ( fclose( backtrack_file ) ) - flexfatal( "error occurred when closing backtracking file" ); - } - - if ( printstats ) - { - endtime = flex_gettime(); - - fprintf( stderr, "%s version %s usage statistics:\n", program_name, - flex_version ); - fprintf( stderr, " started at %s, finished at %s\n", - starttime, endtime ); - - fprintf( stderr, " scanner options: -" ); - - if ( backtrack_report ) - putc( 'b', stderr ); - if ( ddebug ) - putc( 'd', stderr ); - if ( interactive ) - putc( 'I', stderr ); - if ( caseins ) - putc( 'i', stderr ); - if ( ! gen_line_dirs ) - putc( 'L', stderr ); - if ( performance_report ) - putc( 'p', stderr ); - if ( spprdflt ) - putc( 's', stderr ); - if ( use_stdout ) - putc( 't', stderr ); - if ( trace ) - putc( 'T', stderr ); - if ( printstats ) - putc( 'v', stderr ); /* always true! */ - if ( csize == 256 ) - putc( '8', stderr ); - - fprintf( stderr, " -C" ); - - if ( fulltbl ) - putc( 'f', stderr ); - if ( fullspd ) - putc( 'F', stderr ); - if ( useecs ) - putc( 'e', stderr ); - if ( usemecs ) - putc( 'm', stderr ); - - if ( strcmp( skelname, DEFAULT_SKELETON_FILE ) ) - fprintf( stderr, " -S%s", skelname ); - - putc( '\n', stderr ); - - fprintf( stderr, " %d/%d NFA states\n", lastnfa, current_mns ); - fprintf( stderr, " %d/%d DFA states (%d words)\n", lastdfa, - current_max_dfas, totnst ); - fprintf( stderr, - " %d rules\n", num_rules - 1 /* - 1 for def. rule */ ); - - if ( num_backtracking == 0 ) - fprintf( stderr, " No backtracking\n" ); - else if ( fullspd || fulltbl ) - fprintf( stderr, " %d backtracking (non-accepting) states\n", - num_backtracking ); - else - fprintf( stderr, " compressed tables always backtrack\n" ); - - if ( bol_needed ) - fprintf( stderr, " Beginning-of-line patterns used\n" ); - - fprintf( stderr, " %d/%d start conditions\n", lastsc, - current_max_scs ); - fprintf( stderr, " %d epsilon states, %d double epsilon states\n", - numeps, eps2 ); - - if ( lastccl == 0 ) - fprintf( stderr, " no character classes\n" ); - else - fprintf( stderr, - " %d/%d character classes needed %d/%d words of storage, %d reused\n", - lastccl, current_maxccls, - cclmap[lastccl] + ccllen[lastccl], - current_max_ccl_tbl_size, cclreuse ); - - fprintf( stderr, " %d state/nextstate pairs created\n", numsnpairs ); - fprintf( stderr, " %d/%d unique/duplicate transitions\n", - numuniq, numdup ); - - if ( fulltbl ) - { - tblsiz = lastdfa * numecs; - fprintf( stderr, " %d table entries\n", tblsiz ); - } - - else - { - tblsiz = 2 * (lastdfa + numtemps) + 2 * tblend; - - fprintf( stderr, " %d/%d base-def entries created\n", - lastdfa + numtemps, current_max_dfas ); - fprintf( stderr, " %d/%d (peak %d) nxt-chk entries created\n", - tblend, current_max_xpairs, peakpairs ); - fprintf( stderr, - " %d/%d (peak %d) template nxt-chk entries created\n", - numtemps * nummecs, current_max_template_xpairs, - numtemps * numecs ); - fprintf( stderr, " %d empty table entries\n", nummt ); - fprintf( stderr, " %d protos created\n", numprots ); - fprintf( stderr, " %d templates created, %d uses\n", - numtemps, tmpuses ); - } - - if ( useecs ) - { - tblsiz = tblsiz + csize; - fprintf( stderr, " %d/%d equivalence classes created\n", - numecs, csize ); - } - - if ( usemecs ) - { - tblsiz = tblsiz + numecs; - fprintf( stderr, " %d/%d meta-equivalence classes created\n", - nummecs, csize ); - } - - fprintf( stderr, " %d (%d saved) hash collisions, %d DFAs equal\n", - hshcol, hshsave, dfaeql ); - fprintf( stderr, " %d sets of reallocations needed\n", num_reallocs ); - fprintf( stderr, " %d total table entries needed\n", tblsiz ); - } - -#ifndef VMS - exit( status ); -#else - exit( status + 1 ); -#endif - } - - -/* flexinit - initialize flex - * - * synopsis - * int argc; - * char **argv; - * flexinit( argc, argv ); - */ - -void flexinit( argc, argv ) -int argc; -char **argv; - - { - int i, sawcmpflag; - char *arg, *flex_gettime(); - - printstats = syntaxerror = trace = spprdflt = interactive = caseins = false; - backtrack_report = performance_report = ddebug = fulltbl = fullspd = false; - yymore_used = continued_action = reject = false; - yymore_really_used = reject_really_used = false; - gen_line_dirs = usemecs = useecs = true; - - sawcmpflag = false; - use_stdout = false; - - csize = DEFAULT_CSIZE; - - program_name = argv[0]; - - /* read flags */ - for ( --argc, ++argv; argc ; --argc, ++argv ) - { - if ( argv[0][0] != '-' || argv[0][1] == '\0' ) - break; - - arg = argv[0]; - - for ( i = 1; arg[i] != '\0'; ++i ) - switch ( arg[i] ) - { - case 'b': - backtrack_report = true; - break; - - case 'c': - fprintf( stderr, - "%s: Assuming use of deprecated -c flag is really intended to be -C\n", - program_name ); - - /* fall through */ - - case 'C': - if ( i != 1 ) - flexerror( "-C flag must be given separately" ); - - if ( ! sawcmpflag ) - { - useecs = false; - usemecs = false; - fulltbl = false; - sawcmpflag = true; - } - - for ( ++i; arg[i] != '\0'; ++i ) - switch ( arg[i] ) - { - case 'e': - useecs = true; - break; - - case 'F': - fullspd = true; - break; - - case 'f': - fulltbl = true; - break; - - case 'm': - usemecs = true; - break; - - default: - lerrif( "unknown -C option '%c'", - (int) arg[i] ); - break; - } - - goto get_next_arg; - - case 'd': - ddebug = true; - break; - - case 'f': - useecs = usemecs = false; - fulltbl = true; - break; - - case 'F': - useecs = usemecs = false; - fullspd = true; - break; - - case 'I': - interactive = true; - break; - - case 'i': - caseins = true; - break; - - case 'L': - gen_line_dirs = false; - break; - - case 'n': - /* stupid do-nothing deprecated option */ - break; - - case 'p': - performance_report = true; - break; - - case 'S': - if ( i != 1 ) - flexerror( "-S flag must be given separately" ); - - skelname = arg + i + 1; - goto get_next_arg; - - case 's': - spprdflt = true; - break; - - case 't': - use_stdout = true; - break; - - case 'T': - trace = true; - break; - - case 'v': - printstats = true; - break; - - case '8': - csize = CSIZE; - break; - - default: - lerrif( "unknown flag '%c'", (int) arg[i] ); - break; - } - -get_next_arg: /* used by -C and -S flags in lieu of a "continue 2" control */ - ; - } - - if ( (fulltbl || fullspd) && usemecs ) - flexerror( "full table and -Cm don't make sense together" ); - - if ( (fulltbl || fullspd) && interactive ) - flexerror( "full table and -I are (currently) incompatible" ); - - if ( fulltbl && fullspd ) - flexerror( "full table and -F are mutually exclusive" ); - - if ( ! skelname ) - { - static char skeleton_name_storage[400]; - - skelname = skeleton_name_storage; - (void) strcpy( skelname, DEFAULT_SKELETON_FILE ); - } - - if ( ! use_stdout ) - { - FILE *prev_stdout = freopen( outfile, "w", stdout ); - - if ( prev_stdout == NULL ) - lerrsf( "could not create %s", outfile ); - - outfile_created = 1; - } - - num_input_files = argc; - input_files = argv; - set_input_file( num_input_files > 0 ? input_files[0] : NULL ); - - if ( backtrack_report ) - { -#ifndef SHORT_FILE_NAMES - backtrack_file = fopen( "lex.backtrack", "w" ); -#else - backtrack_file = fopen( "lex.bck", "w" ); -#endif - - if ( backtrack_file == NULL ) - flexerror( "could not create lex.backtrack" ); - } - - else - backtrack_file = NULL; - - - lastccl = 0; - lastsc = 0; - - /* initialize the statistics */ - starttime = flex_gettime(); - - if ( (skelfile = fopen( skelname, "r" )) == NULL ) - lerrsf( "can't open skeleton file %s", skelname ); - -#ifndef ACK_MOD -#ifdef SYS_V - action_file_name = tmpnam( NULL ); -#endif -#endif - - if ( action_file_name == NULL ) - { - static char temp_action_file_name[32]; - -#ifndef SHORT_FILE_NAMES - (void) strcpy( temp_action_file_name, "/tmp/flexXXXXXX" ); -#else - (void) strcpy( temp_action_file_name, "flexXXXXXX.tmp" ); -#endif - close(mkstemp(temp_action_file_name)); - - action_file_name = temp_action_file_name; - } - - if ( (temp_action_file = fopen( action_file_name, "w" )) == NULL ) - lerrsf( "can't open temporary action file %s", action_file_name ); - - lastdfa = lastnfa = num_rules = numas = numsnpairs = tmpuses = 0; - numecs = numeps = eps2 = num_reallocs = hshcol = dfaeql = totnst = 0; - numuniq = numdup = hshsave = eofseen = datapos = dataline = 0; - num_backtracking = onesp = numprots = 0; - variable_trailing_context_rules = bol_needed = false; - - linenum = sectnum = 1; - firstprot = NIL; - - /* used in mkprot() so that the first proto goes in slot 1 - * of the proto queue - */ - lastprot = 1; - - if ( useecs ) - { /* set up doubly-linked equivalence classes */ - /* We loop all the way up to csize, since ecgroup[csize] is the - * position used for NUL characters - */ - ecgroup[1] = NIL; - - for ( i = 2; i <= csize; ++i ) - { - ecgroup[i] = i - 1; - nextecm[i - 1] = i; - } - - nextecm[csize] = NIL; - } - - else - { /* put everything in its own equivalence class */ - for ( i = 1; i <= csize; ++i ) - { - ecgroup[i] = i; - nextecm[i] = BAD_SUBSCRIPT; /* to catch errors */ - } - } - - set_up_initial_allocations(); - } - - -/* readin - read in the rules section of the input file(s) - * - * synopsis - * readin(); - */ - -void readin() - - { - skelout(); - - if ( ddebug ) - puts( "#define FLEX_DEBUG" ); - - if ( csize == 256 ) - puts( "#define YY_CHAR unsigned char" ); - else - puts( "#define YY_CHAR char" ); - - line_directive_out( stdout ); - - if ( yyparse() ) - { - pinpoint_message( "fatal parse error" ); - flexend( 1 ); - } - - if ( xlation ) - { - numecs = ecs_from_xlation( ecgroup ); - useecs = true; - } - - else if ( useecs ) - numecs = cre8ecs( nextecm, ecgroup, csize ); - - else - numecs = csize; - - /* now map the equivalence class for NUL to its expected place */ - ecgroup[0] = ecgroup[csize]; - NUL_ec = abs( ecgroup[0] ); - - if ( useecs ) - ccl2ecl(); - } - - - -/* set_up_initial_allocations - allocate memory for internal tables */ - -void set_up_initial_allocations() - - { - current_mns = INITIAL_MNS; - firstst = allocate_integer_array( current_mns ); - lastst = allocate_integer_array( current_mns ); - finalst = allocate_integer_array( current_mns ); - transchar = allocate_integer_array( current_mns ); - trans1 = allocate_integer_array( current_mns ); - trans2 = allocate_integer_array( current_mns ); - accptnum = allocate_integer_array( current_mns ); - assoc_rule = allocate_integer_array( current_mns ); - state_type = allocate_integer_array( current_mns ); - - current_max_rules = INITIAL_MAX_RULES; - rule_type = allocate_integer_array( current_max_rules ); - rule_linenum = allocate_integer_array( current_max_rules ); - - current_max_scs = INITIAL_MAX_SCS; - scset = allocate_integer_array( current_max_scs ); - scbol = allocate_integer_array( current_max_scs ); - scxclu = allocate_integer_array( current_max_scs ); - sceof = allocate_integer_array( current_max_scs ); - scname = allocate_char_ptr_array( current_max_scs ); - actvsc = allocate_integer_array( current_max_scs ); - - current_maxccls = INITIAL_MAX_CCLS; - cclmap = allocate_integer_array( current_maxccls ); - ccllen = allocate_integer_array( current_maxccls ); - cclng = allocate_integer_array( current_maxccls ); - - current_max_ccl_tbl_size = INITIAL_MAX_CCL_TBL_SIZE; - ccltbl = allocate_character_array( current_max_ccl_tbl_size ); - - current_max_dfa_size = INITIAL_MAX_DFA_SIZE; - - current_max_xpairs = INITIAL_MAX_XPAIRS; - nxt = allocate_integer_array( current_max_xpairs ); - chk = allocate_integer_array( current_max_xpairs ); - - current_max_template_xpairs = INITIAL_MAX_TEMPLATE_XPAIRS; - tnxt = allocate_integer_array( current_max_template_xpairs ); - - current_max_dfas = INITIAL_MAX_DFAS; - base = allocate_integer_array( current_max_dfas ); - def = allocate_integer_array( current_max_dfas ); - dfasiz = allocate_integer_array( current_max_dfas ); - accsiz = allocate_integer_array( current_max_dfas ); - dhash = allocate_integer_array( current_max_dfas ); - dss = allocate_int_ptr_array( current_max_dfas ); - dfaacc = allocate_dfaacc_union( current_max_dfas ); - - nultrans = (int *) 0; - } diff --git a/util/flex/misc.c b/util/flex/misc.c deleted file mode 100644 index 02dfbf38a..000000000 --- a/util/flex/misc.c +++ /dev/null @@ -1,836 +0,0 @@ -/* misc - miscellaneous flex routines */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#include -#include "flexdef.h" - - -/* ANSI C does not guarantee that isascii() is defined */ -#ifndef isascii -#define isascii(c) ((c) <= 0177) -#endif - - - -/* declare functions that have forward references */ - -void dataflush PROTO(()); -int otoi PROTO((Char [])); - - -/* action_out - write the actions from the temporary file to lex.yy.c - * - * synopsis - * action_out(); - * - * Copies the action file up to %% (or end-of-file) to lex.yy.c - */ - -void action_out() - - { - char buf[MAXLINE]; - - while ( fgets( buf, MAXLINE, temp_action_file ) != NULL ) - if ( buf[0] == '%' && buf[1] == '%' ) - break; - else - fputs( buf, stdout ); - } - - -/* allocate_array - allocate memory for an integer array of the given size */ - -void *allocate_array( size, element_size ) -int size, element_size; - - { - register void *mem; - - /* on 16-bit int machines (e.g., 80286) we might be trying to - * allocate more than a signed int can hold, and that won't - * work. Cheap test: - */ - if ( element_size * size <= 0 ) - flexfatal( "request for < 1 byte in allocate_array()" ); - - mem = (void *) malloc( (unsigned) (element_size * size) ); - - if ( mem == NULL ) - flexfatal( "memory allocation failed in allocate_array()" ); - - return ( mem ); - } - - -/* all_lower - true if a string is all lower-case - * - * synopsis: - * Char *str; - * int all_lower(); - * true/false = all_lower( str ); - */ - -int all_lower( str ) -register Char *str; - - { - while ( *str ) - { - if ( ! isascii( *str ) || ! islower( *str ) ) - return ( 0 ); - ++str; - } - - return ( 1 ); - } - - -/* all_upper - true if a string is all upper-case - * - * synopsis: - * Char *str; - * int all_upper(); - * true/false = all_upper( str ); - */ - -int all_upper( str ) -register Char *str; - - { - while ( *str ) - { - if ( ! isascii( *str ) || ! isupper( (char) *str ) ) - return ( 0 ); - ++str; - } - - return ( 1 ); - } - - -/* bubble - bubble sort an integer array in increasing order - * - * synopsis - * int v[n], n; - * bubble( v, n ); - * - * description - * sorts the first n elements of array v and replaces them in - * increasing order. - * - * passed - * v - the array to be sorted - * n - the number of elements of 'v' to be sorted */ - -void bubble( v, n ) -int v[], n; - - { - register int i, j, k; - - for ( i = n; i > 1; --i ) - for ( j = 1; j < i; ++j ) - if ( v[j] > v[j + 1] ) /* compare */ - { - k = v[j]; /* exchange */ - v[j] = v[j + 1]; - v[j + 1] = k; - } - } - - -/* clower - replace upper-case letter to lower-case - * - * synopsis: - * Char clower(); - * int c; - * c = clower( c ); - */ - -Char clower( c ) -register int c; - - { - return ( (isascii( c ) && isupper( c )) ? tolower( c ) : c ); - } - - -/* copy_string - returns a dynamically allocated copy of a string - * - * synopsis - * char *str, *copy, *copy_string(); - * copy = copy_string( str ); - */ - -char *copy_string( str ) -register char *str; - - { - register char *c; - char *copy; - - /* find length */ - for ( c = str; *c; ++c ) - ; - - copy = malloc( (unsigned) ((c - str + 1) * sizeof( char )) ); - - if ( copy == NULL ) - flexfatal( "dynamic memory failure in copy_string()" ); - - for ( c = copy; (*c++ = *str++); ) - ; - - return ( copy ); - } - - -/* copy_unsigned_string - - * returns a dynamically allocated copy of a (potentially) unsigned string - * - * synopsis - * Char *str, *copy, *copy_unsigned_string(); - * copy = copy_unsigned_string( str ); - */ - -Char *copy_unsigned_string( str ) -register Char *str; - - { - register Char *c; - Char *copy; - - /* find length */ - for ( c = str; *c; ++c ) - ; - - copy = (Char *) malloc( (unsigned) ((c - str + 1) * sizeof( Char )) ); - - if ( copy == NULL ) - flexfatal( "dynamic memory failure in copy_unsigned_string()" ); - - for ( c = copy; (*c++ = *str++); ) - ; - - return ( copy ); - } - - -/* cshell - shell sort a character array in increasing order - * - * synopsis - * - * Char v[n]; - * int n, special_case_0; - * cshell( v, n, special_case_0 ); - * - * description - * does a shell sort of the first n elements of array v. - * If special_case_0 is true, then any element equal to 0 - * is instead assumed to have infinite weight. - * - * passed - * v - array to be sorted - * n - number of elements of v to be sorted - */ - -void cshell( v, n, special_case_0 ) -Char v[]; -int n, special_case_0; - - { - int gap, i, j, jg; - Char k; - - for ( gap = n / 2; gap > 0; gap = gap / 2 ) - for ( i = gap; i < n; ++i ) - for ( j = i - gap; j >= 0; j = j - gap ) - { - jg = j + gap; - - if ( special_case_0 ) - { - if ( v[jg] == 0 ) - break; - - else if ( v[j] != 0 && v[j] <= v[jg] ) - break; - } - - else if ( v[j] <= v[jg] ) - break; - - k = v[j]; - v[j] = v[jg]; - v[jg] = k; - } - } - - -/* dataend - finish up a block of data declarations - * - * synopsis - * dataend(); - */ - -void dataend() - - { - if ( datapos > 0 ) - dataflush(); - - /* add terminator for initialization */ - puts( " } ;\n" ); - - dataline = 0; - datapos = 0; - } - - - -/* dataflush - flush generated data statements - * - * synopsis - * dataflush(); - */ - -void dataflush() - - { - putchar( '\n' ); - - if ( ++dataline >= NUMDATALINES ) - { - /* put out a blank line so that the table is grouped into - * large blocks that enable the user to find elements easily - */ - putchar( '\n' ); - dataline = 0; - } - - /* reset the number of characters written on the current line */ - datapos = 0; - } - - -/* flexerror - report an error message and terminate - * - * synopsis - * char msg[]; - * flexerror( msg ); - */ - -void flexerror( msg ) -char msg[]; - - { - fprintf( stderr, "%s: %s\n", program_name, msg ); - - flexend( 1 ); - } - - -/* flexfatal - report a fatal error message and terminate - * - * synopsis - * char msg[]; - * flexfatal( msg ); - */ - -void flexfatal( msg ) -char msg[]; - - { - fprintf( stderr, "%s: fatal internal error, %s\n", program_name, msg ); - flexend( 1 ); - } - - -/* flex_gettime - return current time - * - * synopsis - * char *flex_gettime(), *time_str; - * time_str = flex_gettime(); - * - * note - * the routine name has the "flex_" prefix because of name clashes - * with Turbo-C - */ - -/* include sys/types.h to use time_t and make lint happy */ - -#ifndef MS_DOS -#ifndef VMS -#include -#else -#include -#endif -#endif - -#ifdef MS_DOS -#include -typedef long time_t; -#endif - -char *flex_gettime() - - { - time_t t, time(); - char *result, *ctime(), *copy_string(); - - t = time( (long *) 0 ); - - result = copy_string( ctime( &t ) ); - - /* get rid of trailing newline */ - result[24] = '\0'; - - return ( result ); - } - - -/* lerrif - report an error message formatted with one integer argument - * - * synopsis - * char msg[]; - * int arg; - * lerrif( msg, arg ); - */ - -void lerrif( msg, arg ) -char msg[]; -int arg; - - { - char errmsg[MAXLINE]; - (void) sprintf( errmsg, msg, arg ); - flexerror( errmsg ); - } - - -/* lerrsf - report an error message formatted with one string argument - * - * synopsis - * char msg[], arg[]; - * lerrsf( msg, arg ); - */ - -void lerrsf( msg, arg ) -char msg[], arg[]; - - { - char errmsg[MAXLINE]; - - (void) sprintf( errmsg, msg, arg ); - flexerror( errmsg ); - } - - -/* htoi - convert a hexadecimal digit string to an integer value - * - * synopsis: - * int val, htoi(); - * Char str[]; - * val = htoi( str ); - */ - -int htoi( str ) -Char str[]; - - { - int result; - - (void) sscanf( (char *) str, "%x", &result ); - - return ( result ); - } - - -/* is_hex_digit - returns true if a character is a valid hex digit, false - * otherwise - * - * synopsis: - * int true_or_false, is_hex_digit(); - * int ch; - * val = is_hex_digit( ch ); - */ - -int is_hex_digit( ch ) -int ch; - - { - if ( isdigit( ch ) ) - return ( 1 ); - - switch ( clower( ch ) ) - { - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - return ( 1 ); - - default: - return ( 0 ); - } - } - - -/* line_directive_out - spit out a "# line" statement */ - -void line_directive_out( output_file_name ) -FILE *output_file_name; - - { - if ( infilename && gen_line_dirs ) - fprintf( output_file_name, "# line %d \"%s\"\n", linenum, infilename ); - } - - -/* mk2data - generate a data statement for a two-dimensional array - * - * synopsis - * int value; - * mk2data( value ); - * - * generates a data statement initializing the current 2-D array to "value" - */ -void mk2data( value ) -int value; - - { - if ( datapos >= NUMDATAITEMS ) - { - putchar( ',' ); - dataflush(); - } - - if ( datapos == 0 ) - /* indent */ - fputs( " ", stdout ); - - else - putchar( ',' ); - - ++datapos; - - printf( "%5d", value ); - } - - -/* mkdata - generate a data statement - * - * synopsis - * int value; - * mkdata( value ); - * - * generates a data statement initializing the current array element to - * "value" - */ -void mkdata( value ) -int value; - - { - if ( datapos >= NUMDATAITEMS ) - { - putchar( ',' ); - dataflush(); - } - - if ( datapos == 0 ) - /* indent */ - fputs( " ", stdout ); - - else - putchar( ',' ); - - ++datapos; - - printf( "%5d", value ); - } - - -/* myctoi - return the integer represented by a string of digits - * - * synopsis - * Char array[]; - * int val, myctoi(); - * val = myctoi( array ); - * - */ - -int myctoi( array ) -Char array[]; - - { - int val = 0; - - (void) sscanf( (char *) array, "%d", &val ); - - return ( val ); - } - - -/* myesc - return character corresponding to escape sequence - * - * synopsis - * Char array[], c, myesc(); - * c = myesc( array ); - * - */ - -Char myesc( array ) -Char array[]; - - { - Char c, esc_char; - register int sptr; - - switch ( array[1] ) - { -#ifdef ACK_MOD -#if __STDC__ - case 'a': return ( '\a' ); - case 'v': return ( '\v' ); -#else - case 'a': return ( '\007' ); - case 'v': return ( '\013' ); -#endif -#else - case 'a': return ( '\a' ); - case 'v': return ( '\v' ); -#endif - case 'b': return ( '\b' ); - case 'f': return ( '\f' ); - case 'n': return ( '\n' ); - case 'r': return ( '\r' ); - case 't': return ( '\t' ); - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { /* \ */ - sptr = 1; - - while ( isascii( array[sptr] ) && isdigit( array[sptr] ) ) - /* don't increment inside loop control because if - * isdigit() is a macro it might expand into multiple - * increments ... - */ - ++sptr; - - c = array[sptr]; - array[sptr] = '\0'; - - esc_char = otoi( array + 1 ); - - array[sptr] = c; - - return ( esc_char ); - } - - case 'x': - { /* \x */ - int sptr = 2; - - while ( isascii( array[sptr] ) && is_hex_digit( array[sptr] ) ) - /* don't increment inside loop control because if - * isdigit() is a macro it might expand into multiple - * increments ... - */ - ++sptr; - - c = array[sptr]; - array[sptr] = '\0'; - - esc_char = htoi( array + 2 ); - - array[sptr] = c; - - return ( esc_char ); - } - - default: - return ( array[1] ); - } - } - - -/* otoi - convert an octal digit string to an integer value - * - * synopsis: - * int val, otoi(); - * Char str[]; - * val = otoi( str ); - */ - -int otoi( str ) -Char str[]; - - { - int result; - - (void) sscanf( (char *) str, "%o", &result ); - - return ( result ); - } - - -/* readable_form - return the the human-readable form of a character - * - * synopsis: - * int c; - * char *readable_form(); - * = readable_form( c ); - * - * The returned string is in static storage. - */ - -char *readable_form( c ) -register int c; - - { - static char rform[10]; - - if ( (c >= 0 && c < 32) || c >= 127 ) - { - switch ( c ) - { - case '\n': return ( "\\n" ); - case '\t': return ( "\\t" ); - case '\f': return ( "\\f" ); - case '\r': return ( "\\r" ); - case '\b': return ( "\\b" ); - - default: - (void) sprintf( rform, "\\%.3o", c ); - return ( rform ); - } - } - - else if ( c == ' ' ) - return ( "' '" ); - - else - { - rform[0] = c; - rform[1] = '\0'; - - return ( rform ); - } - } - - -/* reallocate_array - increase the size of a dynamic array */ - -void *reallocate_array( array, size, element_size ) -void *array; -int size, element_size; - - { - register void *new_array; - - /* same worry as in allocate_array(): */ - if ( size * element_size <= 0 ) - flexfatal( "attempt to increase array size by less than 1 byte" ); - - new_array = - (void *) realloc( (char *)array, (unsigned) (size * element_size )); - - if ( new_array == NULL ) - flexfatal( "attempt to increase array size failed" ); - - return ( new_array ); - } - - -/* skelout - write out one section of the skeleton file - * - * synopsis - * skelout(); - * - * DESCRIPTION - * Copies from skelfile to stdout until a line beginning with "%%" or - * EOF is found. - */ -void skelout() - - { - char buf[MAXLINE]; - - while ( fgets( buf, MAXLINE, skelfile ) != NULL ) - if ( buf[0] == '%' && buf[1] == '%' ) - break; - else - fputs( buf, stdout ); - } - - -/* transition_struct_out - output a yy_trans_info structure - * - * synopsis - * int element_v, element_n; - * transition_struct_out( element_v, element_n ); - * - * outputs the yy_trans_info structure with the two elements, element_v and - * element_n. Formats the output with spaces and carriage returns. - */ - -void transition_struct_out( element_v, element_n ) -int element_v, element_n; - - { - printf( "%7d, %5d,", element_v, element_n ); - - datapos += TRANS_STRUCT_PRINT_LENGTH; - - if ( datapos >= 75 ) - { - putchar( '\n' ); - - if ( ++dataline % 10 == 0 ) - putchar( '\n' ); - - datapos = 0; - } - } diff --git a/util/flex/nfa.c b/util/flex/nfa.c deleted file mode 100644 index f34dd9c9a..000000000 --- a/util/flex/nfa.c +++ /dev/null @@ -1,717 +0,0 @@ -/* nfa - NFA construction routines */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#include "flexdef.h" - - -/* declare functions that have forward references */ - -int dupmachine PROTO((int)); -void mkxtion PROTO((int, int)); - - -/* add_accept - add an accepting state to a machine - * - * synopsis - * - * add_accept( mach, accepting_number ); - * - * accepting_number becomes mach's accepting number. - */ - -void add_accept( mach, accepting_number ) -int mach, accepting_number; - - { - /* hang the accepting number off an epsilon state. if it is associated - * with a state that has a non-epsilon out-transition, then the state - * will accept BEFORE it makes that transition, i.e., one character - * too soon - */ - - if ( transchar[finalst[mach]] == SYM_EPSILON ) - accptnum[finalst[mach]] = accepting_number; - - else - { - int astate = mkstate( SYM_EPSILON ); - accptnum[astate] = accepting_number; - mach = link_machines( mach, astate ); - } - } - - -/* copysingl - make a given number of copies of a singleton machine - * - * synopsis - * - * newsng = copysingl( singl, num ); - * - * newsng - a new singleton composed of num copies of singl - * singl - a singleton machine - * num - the number of copies of singl to be present in newsng - */ - -int copysingl( singl, num ) -int singl, num; - - { - int copy, i; - - copy = mkstate( SYM_EPSILON ); - - for ( i = 1; i <= num; ++i ) - copy = link_machines( copy, dupmachine( singl ) ); - - return ( copy ); - } - - -/* dumpnfa - debugging routine to write out an nfa - * - * synopsis - * int state1; - * dumpnfa( state1 ); - */ - -void dumpnfa( state1 ) -int state1; - - { - int sym, tsp1, tsp2, anum, ns; - - fprintf( stderr, "\n\n********** beginning dump of nfa with start state %d\n", - state1 ); - - /* we probably should loop starting at firstst[state1] and going to - * lastst[state1], but they're not maintained properly when we "or" - * all of the rules together. So we use our knowledge that the machine - * starts at state 1 and ends at lastnfa. - */ - - /* for ( ns = firstst[state1]; ns <= lastst[state1]; ++ns ) */ - for ( ns = 1; ns <= lastnfa; ++ns ) - { - fprintf( stderr, "state # %4d\t", ns ); - - sym = transchar[ns]; - tsp1 = trans1[ns]; - tsp2 = trans2[ns]; - anum = accptnum[ns]; - - fprintf( stderr, "%3d: %4d, %4d", sym, tsp1, tsp2 ); - - if ( anum != NIL ) - fprintf( stderr, " [%d]", anum ); - - fprintf( stderr, "\n" ); - } - - fprintf( stderr, "********** end of dump\n" ); - } - - -/* dupmachine - make a duplicate of a given machine - * - * synopsis - * - * copy = dupmachine( mach ); - * - * copy - holds duplicate of mach - * mach - machine to be duplicated - * - * note that the copy of mach is NOT an exact duplicate; rather, all the - * transition states values are adjusted so that the copy is self-contained, - * as the original should have been. - * - * also note that the original MUST be contiguous, with its low and high - * states accessible by the arrays firstst and lastst - */ - -int dupmachine( mach ) -int mach; - - { - int i, init, state_offset; - int state = 0; - int last = lastst[mach]; - - for ( i = firstst[mach]; i <= last; ++i ) - { - state = mkstate( transchar[i] ); - - if ( trans1[i] != NO_TRANSITION ) - { - mkxtion( finalst[state], trans1[i] + state - i ); - - if ( transchar[i] == SYM_EPSILON && trans2[i] != NO_TRANSITION ) - mkxtion( finalst[state], trans2[i] + state - i ); - } - - accptnum[state] = accptnum[i]; - } - - if ( state == 0 ) - flexfatal( "empty machine in dupmachine()" ); - - state_offset = state - i + 1; - - init = mach + state_offset; - firstst[init] = firstst[mach] + state_offset; - finalst[init] = finalst[mach] + state_offset; - lastst[init] = lastst[mach] + state_offset; - - return ( init ); - } - - -/* finish_rule - finish up the processing for a rule - * - * synopsis - * - * finish_rule( mach, variable_trail_rule, headcnt, trailcnt ); - * - * An accepting number is added to the given machine. If variable_trail_rule - * is true then the rule has trailing context and both the head and trail - * are variable size. Otherwise if headcnt or trailcnt is non-zero then - * the machine recognizes a pattern with trailing context and headcnt is - * the number of characters in the matched part of the pattern, or zero - * if the matched part has variable length. trailcnt is the number of - * trailing context characters in the pattern, or zero if the trailing - * context has variable length. - */ - -void finish_rule( mach, variable_trail_rule, headcnt, trailcnt ) -int mach, variable_trail_rule, headcnt, trailcnt; - - { - add_accept( mach, num_rules ); - - /* we did this in new_rule(), but it often gets the wrong - * number because we do it before we start parsing the current rule - */ - rule_linenum[num_rules] = linenum; - - /* if this is a continued action, then the line-number has - * already been updated, giving us the wrong number - */ - if ( continued_action ) - --rule_linenum[num_rules]; - - fprintf( temp_action_file, "case %d:\n", num_rules ); - - if ( variable_trail_rule ) - { - rule_type[num_rules] = RULE_VARIABLE; - - if ( performance_report ) - fprintf( stderr, "Variable trailing context rule at line %d\n", - rule_linenum[num_rules] ); - - variable_trailing_context_rules = true; - } - - else - { - rule_type[num_rules] = RULE_NORMAL; - - if ( headcnt > 0 || trailcnt > 0 ) - { - /* do trailing context magic to not match the trailing characters */ - char *scanner_cp = "yy_c_buf_p = yy_cp"; - char *scanner_bp = "yy_bp"; - - fprintf( temp_action_file, - "*yy_cp = yy_hold_char; /* undo effects of setting up yytext */\n" ); - - if ( headcnt > 0 ) - fprintf( temp_action_file, "%s = %s + %d;\n", - scanner_cp, scanner_bp, headcnt ); - - else - fprintf( temp_action_file, - "%s -= %d;\n", scanner_cp, trailcnt ); - - fprintf( temp_action_file, - "YY_DO_BEFORE_ACTION; /* set up yytext again */\n" ); - } - } - - line_directive_out( temp_action_file ); - } - - -/* link_machines - connect two machines together - * - * synopsis - * - * new = link_machines( first, last ); - * - * new - a machine constructed by connecting first to last - * first - the machine whose successor is to be last - * last - the machine whose predecessor is to be first - * - * note: this routine concatenates the machine first with the machine - * last to produce a machine new which will pattern-match first first - * and then last, and will fail if either of the sub-patterns fails. - * FIRST is set to new by the operation. last is unmolested. - */ - -int link_machines( first, last ) -int first, last; - - { - if ( first == NIL ) - return ( last ); - - else if ( last == NIL ) - return ( first ); - - else - { - mkxtion( finalst[first], last ); - finalst[first] = finalst[last]; - lastst[first] = max( lastst[first], lastst[last] ); - firstst[first] = min( firstst[first], firstst[last] ); - - return ( first ); - } - } - - -/* mark_beginning_as_normal - mark each "beginning" state in a machine - * as being a "normal" (i.e., not trailing context- - * associated) states - * - * synopsis - * - * mark_beginning_as_normal( mach ) - * - * mach - machine to mark - * - * The "beginning" states are the epsilon closure of the first state - */ - -void mark_beginning_as_normal( mach ) -register int mach; - - { - switch ( state_type[mach] ) - { - case STATE_NORMAL: - /* oh, we've already visited here */ - return; - - case STATE_TRAILING_CONTEXT: - state_type[mach] = STATE_NORMAL; - - if ( transchar[mach] == SYM_EPSILON ) - { - if ( trans1[mach] != NO_TRANSITION ) - mark_beginning_as_normal( trans1[mach] ); - - if ( trans2[mach] != NO_TRANSITION ) - mark_beginning_as_normal( trans2[mach] ); - } - break; - - default: - flexerror( "bad state type in mark_beginning_as_normal()" ); - break; - } - } - - -/* mkbranch - make a machine that branches to two machines - * - * synopsis - * - * branch = mkbranch( first, second ); - * - * branch - a machine which matches either first's pattern or second's - * first, second - machines whose patterns are to be or'ed (the | operator) - * - * note that first and second are NEITHER destroyed by the operation. Also, - * the resulting machine CANNOT be used with any other "mk" operation except - * more mkbranch's. Compare with mkor() - */ - -int mkbranch( first, second ) -int first, second; - - { - int eps; - - if ( first == NO_TRANSITION ) - return ( second ); - - else if ( second == NO_TRANSITION ) - return ( first ); - - eps = mkstate( SYM_EPSILON ); - - mkxtion( eps, first ); - mkxtion( eps, second ); - - return ( eps ); - } - - -/* mkclos - convert a machine into a closure - * - * synopsis - * new = mkclos( state ); - * - * new - a new state which matches the closure of "state" - */ - -int mkclos( state ) -int state; - - { - return ( mkopt( mkposcl( state ) ) ); - } - - -/* mkopt - make a machine optional - * - * synopsis - * - * new = mkopt( mach ); - * - * new - a machine which optionally matches whatever mach matched - * mach - the machine to make optional - * - * notes: - * 1. mach must be the last machine created - * 2. mach is destroyed by the call - */ - -int mkopt( mach ) -int mach; - - { - int eps; - - if ( ! SUPER_FREE_EPSILON(finalst[mach]) ) - { - eps = mkstate( SYM_EPSILON ); - mach = link_machines( mach, eps ); - } - - /* can't skimp on the following if FREE_EPSILON(mach) is true because - * some state interior to "mach" might point back to the beginning - * for a closure - */ - eps = mkstate( SYM_EPSILON ); - mach = link_machines( eps, mach ); - - mkxtion( mach, finalst[mach] ); - - return ( mach ); - } - - -/* mkor - make a machine that matches either one of two machines - * - * synopsis - * - * new = mkor( first, second ); - * - * new - a machine which matches either first's pattern or second's - * first, second - machines whose patterns are to be or'ed (the | operator) - * - * note that first and second are both destroyed by the operation - * the code is rather convoluted because an attempt is made to minimize - * the number of epsilon states needed - */ - -int mkor( first, second ) -int first, second; - - { - int eps, orend; - - if ( first == NIL ) - return ( second ); - - else if ( second == NIL ) - return ( first ); - - else - { - /* see comment in mkopt() about why we can't use the first state - * of "first" or "second" if they satisfy "FREE_EPSILON" - */ - eps = mkstate( SYM_EPSILON ); - - first = link_machines( eps, first ); - - mkxtion( first, second ); - - if ( SUPER_FREE_EPSILON(finalst[first]) && - accptnum[finalst[first]] == NIL ) - { - orend = finalst[first]; - mkxtion( finalst[second], orend ); - } - - else if ( SUPER_FREE_EPSILON(finalst[second]) && - accptnum[finalst[second]] == NIL ) - { - orend = finalst[second]; - mkxtion( finalst[first], orend ); - } - - else - { - eps = mkstate( SYM_EPSILON ); - - first = link_machines( first, eps ); - orend = finalst[first]; - - mkxtion( finalst[second], orend ); - } - } - - finalst[first] = orend; - return ( first ); - } - - -/* mkposcl - convert a machine into a positive closure - * - * synopsis - * new = mkposcl( state ); - * - * new - a machine matching the positive closure of "state" - */ - -int mkposcl( state ) -int state; - - { - int eps; - - if ( SUPER_FREE_EPSILON(finalst[state]) ) - { - mkxtion( finalst[state], state ); - return ( state ); - } - - else - { - eps = mkstate( SYM_EPSILON ); - mkxtion( eps, state ); - return ( link_machines( state, eps ) ); - } - } - - -/* mkrep - make a replicated machine - * - * synopsis - * new = mkrep( mach, lb, ub ); - * - * new - a machine that matches whatever "mach" matched from "lb" - * number of times to "ub" number of times - * - * note - * if "ub" is INFINITY then "new" matches "lb" or more occurrences of "mach" - */ - -int mkrep( mach, lb, ub ) -int mach, lb, ub; - - { - int base_mach, tail, copy, i; - - base_mach = copysingl( mach, lb - 1 ); - - if ( ub == INFINITY ) - { - copy = dupmachine( mach ); - mach = link_machines( mach, - link_machines( base_mach, mkclos( copy ) ) ); - } - - else - { - tail = mkstate( SYM_EPSILON ); - - for ( i = lb; i < ub; ++i ) - { - copy = dupmachine( mach ); - tail = mkopt( link_machines( copy, tail ) ); - } - - mach = link_machines( mach, link_machines( base_mach, tail ) ); - } - - return ( mach ); - } - - -/* mkstate - create a state with a transition on a given symbol - * - * synopsis - * - * state = mkstate( sym ); - * - * state - a new state matching sym - * sym - the symbol the new state is to have an out-transition on - * - * note that this routine makes new states in ascending order through the - * state array (and increments LASTNFA accordingly). The routine DUPMACHINE - * relies on machines being made in ascending order and that they are - * CONTIGUOUS. Change it and you will have to rewrite DUPMACHINE (kludge - * that it admittedly is) - */ - -int mkstate( sym ) -int sym; - - { - if ( ++lastnfa >= current_mns ) - { - if ( (current_mns += MNS_INCREMENT) >= MAXIMUM_MNS ) - lerrif( "input rules are too complicated (>= %d NFA states)", - current_mns ); - - ++num_reallocs; - - firstst = reallocate_integer_array( firstst, current_mns ); - lastst = reallocate_integer_array( lastst, current_mns ); - finalst = reallocate_integer_array( finalst, current_mns ); - transchar = reallocate_integer_array( transchar, current_mns ); - trans1 = reallocate_integer_array( trans1, current_mns ); - trans2 = reallocate_integer_array( trans2, current_mns ); - accptnum = reallocate_integer_array( accptnum, current_mns ); - assoc_rule = reallocate_integer_array( assoc_rule, current_mns ); - state_type = reallocate_integer_array( state_type, current_mns ); - } - - firstst[lastnfa] = lastnfa; - finalst[lastnfa] = lastnfa; - lastst[lastnfa] = lastnfa; - transchar[lastnfa] = sym; - trans1[lastnfa] = NO_TRANSITION; - trans2[lastnfa] = NO_TRANSITION; - accptnum[lastnfa] = NIL; - assoc_rule[lastnfa] = num_rules; - state_type[lastnfa] = current_state_type; - - /* fix up equivalence classes base on this transition. Note that any - * character which has its own transition gets its own equivalence class. - * Thus only characters which are only in character classes have a chance - * at being in the same equivalence class. E.g. "a|b" puts 'a' and 'b' - * into two different equivalence classes. "[ab]" puts them in the same - * equivalence class (barring other differences elsewhere in the input). - */ - - if ( sym < 0 ) - { - /* we don't have to update the equivalence classes since that was - * already done when the ccl was created for the first time - */ - } - - else if ( sym == SYM_EPSILON ) - ++numeps; - - else - { - if ( useecs ) - /* map NUL's to csize */ - mkechar( sym ? sym : csize, nextecm, ecgroup ); - } - - return ( lastnfa ); - } - - -/* mkxtion - make a transition from one state to another - * - * synopsis - * - * mkxtion( statefrom, stateto ); - * - * statefrom - the state from which the transition is to be made - * stateto - the state to which the transition is to be made - */ - -void mkxtion( statefrom, stateto ) -int statefrom, stateto; - - { - if ( trans1[statefrom] == NO_TRANSITION ) - trans1[statefrom] = stateto; - - else if ( (transchar[statefrom] != SYM_EPSILON) || - (trans2[statefrom] != NO_TRANSITION) ) - flexfatal( "found too many transitions in mkxtion()" ); - - else - { /* second out-transition for an epsilon state */ - ++eps2; - trans2[statefrom] = stateto; - } - } - -/* new_rule - initialize for a new rule - * - * synopsis - * - * new_rule(); - * - * the global num_rules is incremented and the any corresponding dynamic - * arrays (such as rule_type[]) are grown as needed. - */ - -void new_rule() - - { - if ( ++num_rules >= current_max_rules ) - { - ++num_reallocs; - current_max_rules += MAX_RULES_INCREMENT; - rule_type = reallocate_integer_array( rule_type, current_max_rules ); - rule_linenum = - reallocate_integer_array( rule_linenum, current_max_rules ); - } - - if ( num_rules > MAX_RULE ) - lerrif( "too many rules (> %d)!", MAX_RULE ); - - rule_linenum[num_rules] = linenum; - } diff --git a/util/flex/parse.y b/util/flex/parse.y deleted file mode 100644 index 87343e798..000000000 --- a/util/flex/parse.y +++ /dev/null @@ -1,702 +0,0 @@ - -/* parse.y - parser for flex input */ - -%token CHAR NUMBER SECTEND SCDECL XSCDECL WHITESPACE NAME PREVCCL EOF_OP - -%{ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#include "flexdef.h" - -int pat, scnum, eps, headcnt, trailcnt, anyccl, lastchar, i, actvp, rulelen; -int trlcontxt, xcluflg, cclsorted, varlength, variable_trail_rule; -Char clower(); - -static int madeany = false; /* whether we've made the '.' character class */ -int previous_continued_action; /* whether the previous rule's action was '|' */ - -%} - -%% -goal : initlex sect1 sect1end sect2 initforrule - { /* add default rule */ - int def_rule; - - pat = cclinit(); - cclnegate( pat ); - - def_rule = mkstate( -pat ); - - finish_rule( def_rule, false, 0, 0 ); - - for ( i = 1; i <= lastsc; ++i ) - scset[i] = mkbranch( scset[i], def_rule ); - - if ( spprdflt ) - fputs( "YY_FATAL_ERROR( \"flex scanner jammed\" )", - temp_action_file ); - else - fputs( "ECHO", temp_action_file ); - - fputs( ";\n\tYY_BREAK\n", temp_action_file ); - } - ; - -initlex : - { - /* initialize for processing rules */ - - /* create default DFA start condition */ - scinstal( "INITIAL", false ); - } - ; - -sect1 : sect1 startconddecl WHITESPACE namelist1 '\n' - | - | error '\n' - { synerr( "unknown error processing section 1" ); } - ; - -sect1end : SECTEND - ; - -startconddecl : SCDECL - { - /* these productions are separate from the s1object - * rule because the semantics must be done before - * we parse the remainder of an s1object - */ - - xcluflg = false; - } - - | XSCDECL - { xcluflg = true; } - ; - -namelist1 : namelist1 WHITESPACE NAME - { scinstal( nmstr, xcluflg ); } - - | NAME - { scinstal( nmstr, xcluflg ); } - - | error - { synerr( "bad start condition list" ); } - ; - -sect2 : sect2 initforrule flexrule '\n' - | - ; - -initforrule : - { - /* initialize for a parse of one rule */ - trlcontxt = variable_trail_rule = varlength = false; - trailcnt = headcnt = rulelen = 0; - current_state_type = STATE_NORMAL; - previous_continued_action = continued_action; - new_rule(); - } - ; - -flexrule : scon '^' rule - { - pat = $3; - finish_rule( pat, variable_trail_rule, - headcnt, trailcnt ); - - for ( i = 1; i <= actvp; ++i ) - scbol[actvsc[i]] = - mkbranch( scbol[actvsc[i]], pat ); - - if ( ! bol_needed ) - { - bol_needed = true; - - if ( performance_report ) - pinpoint_message( - "'^' operator results in sub-optimal performance" ); - } - } - - | scon rule - { - pat = $2; - finish_rule( pat, variable_trail_rule, - headcnt, trailcnt ); - - for ( i = 1; i <= actvp; ++i ) - scset[actvsc[i]] = - mkbranch( scset[actvsc[i]], pat ); - } - - | '^' rule - { - pat = $2; - finish_rule( pat, variable_trail_rule, - headcnt, trailcnt ); - - /* add to all non-exclusive start conditions, - * including the default (0) start condition - */ - - for ( i = 1; i <= lastsc; ++i ) - if ( ! scxclu[i] ) - scbol[i] = mkbranch( scbol[i], pat ); - - if ( ! bol_needed ) - { - bol_needed = true; - - if ( performance_report ) - pinpoint_message( - "'^' operator results in sub-optimal performance" ); - } - } - - | rule - { - pat = $1; - finish_rule( pat, variable_trail_rule, - headcnt, trailcnt ); - - for ( i = 1; i <= lastsc; ++i ) - if ( ! scxclu[i] ) - scset[i] = mkbranch( scset[i], pat ); - } - - | scon EOF_OP - { build_eof_action(); } - - | EOF_OP - { - /* this EOF applies to all start conditions - * which don't already have EOF actions - */ - actvp = 0; - - for ( i = 1; i <= lastsc; ++i ) - if ( ! sceof[i] ) - actvsc[++actvp] = i; - - if ( actvp == 0 ) - pinpoint_message( - "warning - all start conditions already have <> rules" ); - - else - build_eof_action(); - } - - | error - { synerr( "unrecognized rule" ); } - ; - -scon : '<' namelist2 '>' - ; - -namelist2 : namelist2 ',' NAME - { - if ( (scnum = sclookup( nmstr )) == 0 ) - format_pinpoint_message( - "undeclared start condition %s", nmstr ); - - else - actvsc[++actvp] = scnum; - } - - | NAME - { - if ( (scnum = sclookup( nmstr )) == 0 ) - format_pinpoint_message( - "undeclared start condition %s", nmstr ); - else - actvsc[actvp = 1] = scnum; - } - - | error - { synerr( "bad start condition list" ); } - ; - -rule : re2 re - { - if ( transchar[lastst[$2]] != SYM_EPSILON ) - /* provide final transition \now/ so it - * will be marked as a trailing context - * state - */ - $2 = link_machines( $2, mkstate( SYM_EPSILON ) ); - - mark_beginning_as_normal( $2 ); - current_state_type = STATE_NORMAL; - - if ( previous_continued_action ) - { - /* we need to treat this as variable trailing - * context so that the backup does not happen - * in the action but before the action switch - * statement. If the backup happens in the - * action, then the rules "falling into" this - * one's action will *also* do the backup, - * erroneously. - */ - if ( ! varlength || headcnt != 0 ) - { - fprintf( stderr, - "%s: warning - trailing context rule at line %d made variable because\n", - program_name, linenum ); - fprintf( stderr, - " of preceding '|' action\n" ); - } - - /* mark as variable */ - varlength = true; - headcnt = 0; - } - - if ( varlength && headcnt == 0 ) - { /* variable trailing context rule */ - /* mark the first part of the rule as the accepting - * "head" part of a trailing context rule - */ - /* by the way, we didn't do this at the beginning - * of this production because back then - * current_state_type was set up for a trail - * rule, and add_accept() can create a new - * state ... - */ - add_accept( $1, num_rules | YY_TRAILING_HEAD_MASK ); - variable_trail_rule = true; - } - - else - trailcnt = rulelen; - - $$ = link_machines( $1, $2 ); - } - - | re2 re '$' - { synerr( "trailing context used twice" ); } - - | re '$' - { - if ( trlcontxt ) - { - synerr( "trailing context used twice" ); - $$ = mkstate( SYM_EPSILON ); - } - - else if ( previous_continued_action ) - { - /* see the comment in the rule for "re2 re" - * above - */ - if ( ! varlength || headcnt != 0 ) - { - fprintf( stderr, - "%s: warning - trailing context rule at line %d made variable because\n", - program_name, linenum ); - fprintf( stderr, - " of preceding '|' action\n" ); - } - - /* mark as variable */ - varlength = true; - headcnt = 0; - } - - trlcontxt = true; - - if ( ! varlength ) - headcnt = rulelen; - - ++rulelen; - trailcnt = 1; - - eps = mkstate( SYM_EPSILON ); - $$ = link_machines( $1, - link_machines( eps, mkstate( '\n' ) ) ); - } - - | re - { - $$ = $1; - - if ( trlcontxt ) - { - if ( varlength && headcnt == 0 ) - /* both head and trail are variable-length */ - variable_trail_rule = true; - else - trailcnt = rulelen; - } - } - ; - - -re : re '|' series - { - varlength = true; - $$ = mkor( $1, $3 ); - } - - | series - { $$ = $1; } - ; - - -re2 : re '/' - { - /* this rule is written separately so - * the reduction will occur before the trailing - * series is parsed - */ - - if ( trlcontxt ) - synerr( "trailing context used twice" ); - else - trlcontxt = true; - - if ( varlength ) - /* we hope the trailing context is fixed-length */ - varlength = false; - else - headcnt = rulelen; - - rulelen = 0; - - current_state_type = STATE_TRAILING_CONTEXT; - $$ = $1; - } - ; - -series : series singleton - { - /* this is where concatenation of adjacent patterns - * gets done - */ - $$ = link_machines( $1, $2 ); - } - - | singleton - { $$ = $1; } - ; - -singleton : singleton '*' - { - varlength = true; - - $$ = mkclos( $1 ); - } - - | singleton '+' - { - varlength = true; - - $$ = mkposcl( $1 ); - } - - | singleton '?' - { - varlength = true; - - $$ = mkopt( $1 ); - } - - | singleton '{' NUMBER ',' NUMBER '}' - { - varlength = true; - - if ( $3 > $5 || $3 < 0 ) - { - synerr( "bad iteration values" ); - $$ = $1; - } - else - { - if ( $3 == 0 ) - $$ = mkopt( mkrep( $1, $3, $5 ) ); - else - $$ = mkrep( $1, $3, $5 ); - } - } - - | singleton '{' NUMBER ',' '}' - { - varlength = true; - - if ( $3 <= 0 ) - { - synerr( "iteration value must be positive" ); - $$ = $1; - } - - else - $$ = mkrep( $1, $3, INFINITY ); - } - - | singleton '{' NUMBER '}' - { - /* the singleton could be something like "(foo)", - * in which case we have no idea what its length - * is, so we punt here. - */ - varlength = true; - - if ( $3 <= 0 ) - { - synerr( "iteration value must be positive" ); - $$ = $1; - } - - else - $$ = link_machines( $1, copysingl( $1, $3 - 1 ) ); - } - - | '.' - { - if ( ! madeany ) - { - /* create the '.' character class */ - anyccl = cclinit(); - ccladd( anyccl, '\n' ); - cclnegate( anyccl ); - - if ( useecs ) - mkeccl( ccltbl + cclmap[anyccl], - ccllen[anyccl], nextecm, - ecgroup, csize, csize ); - - madeany = true; - } - - ++rulelen; - - $$ = mkstate( -anyccl ); - } - - | fullccl - { - if ( ! cclsorted ) - /* sort characters for fast searching. We use a - * shell sort since this list could be large. - */ - cshell( ccltbl + cclmap[$1], ccllen[$1], true ); - - if ( useecs ) - mkeccl( ccltbl + cclmap[$1], ccllen[$1], - nextecm, ecgroup, csize, csize ); - - ++rulelen; - - $$ = mkstate( -$1 ); - } - - | PREVCCL - { - ++rulelen; - - $$ = mkstate( -$1 ); - } - - | '"' string '"' - { $$ = $2; } - - | '(' re ')' - { $$ = $2; } - - | CHAR - { - ++rulelen; - - if ( caseins && $1 >= 'A' && $1 <= 'Z' ) - $1 = clower( $1 ); - - $$ = mkstate( $1 ); - } - ; - -fullccl : '[' ccl ']' - { $$ = $2; } - - | '[' '^' ccl ']' - { - /* *Sigh* - to be compatible Unix lex, negated ccls - * match newlines - */ -#ifdef NOTDEF - ccladd( $3, '\n' ); /* negated ccls don't match '\n' */ - cclsorted = false; /* because we added the newline */ -#endif - cclnegate( $3 ); - $$ = $3; - } - ; - -ccl : ccl CHAR '-' CHAR - { - if ( $2 > $4 ) - synerr( "negative range in character class" ); - - else - { - if ( caseins ) - { - if ( $2 >= 'A' && $2 <= 'Z' ) - $2 = clower( $2 ); - if ( $4 >= 'A' && $4 <= 'Z' ) - $4 = clower( $4 ); - } - - for ( i = $2; i <= $4; ++i ) - ccladd( $1, i ); - - /* keep track if this ccl is staying in alphabetical - * order - */ - cclsorted = cclsorted && ($2 > lastchar); - lastchar = $4; - } - - $$ = $1; - } - - | ccl CHAR - { - if ( caseins ) - if ( $2 >= 'A' && $2 <= 'Z' ) - $2 = clower( $2 ); - - ccladd( $1, $2 ); - cclsorted = cclsorted && ($2 > lastchar); - lastchar = $2; - $$ = $1; - } - - | - { - cclsorted = true; - lastchar = 0; - $$ = cclinit(); - } - ; - -string : string CHAR - { - if ( caseins ) - if ( $2 >= 'A' && $2 <= 'Z' ) - $2 = clower( $2 ); - - ++rulelen; - - $$ = link_machines( $1, mkstate( $2 ) ); - } - - | - { $$ = mkstate( SYM_EPSILON ); } - ; - -%% - - -/* build_eof_action - build the "<>" action for the active start - * conditions - */ - -void build_eof_action() - - { - register int i; - - for ( i = 1; i <= actvp; ++i ) - { - if ( sceof[actvsc[i]] ) - format_pinpoint_message( - "multiple <> rules for start condition %s", - scname[actvsc[i]] ); - - else - { - sceof[actvsc[i]] = true; - fprintf( temp_action_file, "case YY_STATE_EOF(%s):\n", - scname[actvsc[i]] ); - } - } - - line_directive_out( temp_action_file ); - } - - -/* synerr - report a syntax error */ - -void synerr( str ) -char str[]; - - { - syntaxerror = true; - pinpoint_message( str ); - } - - -/* format_pinpoint_message - write out a message formatted with one string, - * pinpointing its location - */ - -void format_pinpoint_message( msg, arg ) -char msg[], arg[]; - - { - char errmsg[MAXLINE]; - - (void) sprintf( errmsg, msg, arg ); - pinpoint_message( errmsg ); - } - - -/* pinpoint_message - write out a message, pinpointing its location */ - -void pinpoint_message( str ) -char str[]; - - { - fprintf( stderr, "\"%s\", line %d: %s\n", infilename, linenum, str ); - } - - -/* yyerror - eat up an error message from the parser; - * currently, messages are ignore - */ - -void yyerror( msg ) -char msg[]; - - { - } diff --git a/util/flex/proto.make b/util/flex/proto.make deleted file mode 100644 index 80087b933..000000000 --- a/util/flex/proto.make +++ /dev/null @@ -1,179 +0,0 @@ -# $Id$ - -#PARAMS do not remove this line! - -SRC_DIR = $(SRC_HOME)/util/flex - -# make file for "flex" tool - -# Porting considerations: -# -# For System V Unix machines, add -DUSG to CFLAGS (if it's not -# automatically defined) -# For Vax/VMS, add "-DVMS -DUSG" to CFLAGS. -# For MS-DOS, add "-DMS_DOS -DUSG" to CFLAGS. Create \tmp if not present. -# You will also want to rename flex.skel to something with a three -# character extension, change SKELETON_FILE below appropriately, -# See MSDOS.notes for more info. -# For Amiga, add "-DAMIGA -DUSG" to CFLAGS. -# For SCO Unix, add "-DSCO_UNIX" to CFLAGS. -# -# For C compilers which don't know about "void", add -Dvoid=int to CFLAGS. -# -# If your C compiler is ANSI standard but does not include the -# header file (some installations of gcc have this problem), then add -# -DDONT_HAVE_STDLIB_H to CFLAGS. -# -# By default, flex will be configured to generate 8-bit scanners only -# if the -8 flag is given. If you want it to always generate 8-bit -# scanners, add "-DDEFAULT_CSIZE=256" to CFLAGS. Note that doing -# so will double the size of all uncompressed scanners. -# -# If on your system you have trouble building flex due to 8-bit -# character problems, remove the -8 from FLEX_FLAGS and the -# "#define FLEX_8_BIT_CHARS" from the beginning of flexdef.h. - - -# the first time around use "make first_flex" - - -# Installation targeting. Files will be installed under the tree rooted -# at DESTDIR. User commands will be installed in BINDIR, library files -# in LIBDIR (which will be created if necessary), auxiliary files in -# AUXDIR; -DESTDIR = -BINDIR = $(TARGET_HOME)/bin -AUXDIR = $(TARGET_HOME)/lib/flex - -# MAKE = make - -SKELETON_FILE = \"$(AUXDIR)/flex.skel\" -SKELFLAGS = -DDEFAULT_SKELETON_FILE=$(SKELETON_FILE) -INCLUDES = -I$(SRC_DIR) -I. -CFLAGS = $(COPTIONS) -DACK_MOD $(INCLUDES) -LDFLAGS = $(LDOPTIONS) - -COMPRESSION = -FLEX_FLAGS = -ist8 -Sflex.skel -# which "flex" to use to generate scan.c from scan.l -FLEX = flex - -FLEXOBJS = \ - ccl.$(SUF) \ - dfa.$(SUF) \ - ecs.$(SUF) \ - gen.$(SUF) \ - main.$(SUF) \ - misc.$(SUF) \ - nfa.$(SUF) \ - parse.$(SUF) \ - scan.$(SUF) \ - sym.$(SUF) \ - tblcmp.$(SUF) \ - yylex.$(SUF) - -FLEX_C_SOURCES = \ - $(SRC_DIR)/ccl.c \ - $(SRC_DIR)/dfa.c \ - $(SRC_DIR)/ecs.c \ - $(SRC_DIR)/gen.c \ - $(SRC_DIR)/main.c \ - $(SRC_DIR)/misc.c \ - $(SRC_DIR)/nfa.c \ - $(SRC_DIR)/parse.c \ - $(SRC_DIR)/scan.c \ - $(SRC_DIR)/sym.c \ - $(SRC_DIR)/tblcmp.c \ - $(SRC_DIR)/yylex.c - - -all : flex - -flex : $(FLEXOBJS) - $(CC) -o flex $(LDFLAGS) $(FLEXOBJS) - -first_flex: - cp $(SRC_DIR)/initscan.c scan.c - chmod +w scan.c - make $(MFLAGS) flex - -parse.h parse.c : $(SRC_DIR)/parse.y - yacc -d $(SRC_DIR)/parse.y - @mv y.tab.c parse.c - @mv y.tab.h parse.h - -scan.c : $(SRC_DIR)/scan.l - $(FLEX) $(FLEX_FLAGS) $(COMPRESSION) $(SRC_DIR)/scan.l >scan.c - -scan.$(SUF) : scan.c parse.h $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c scan.c - -main.$(SUF) : $(SRC_DIR)/main.c $(SRC_DIR)/flexdef.h - -mkdir $(AUXDIR) - $(CC) $(CFLAGS) -c $(SKELFLAGS) $(SRC_DIR)/main.c - -ccl.$(SUF) : $(SRC_DIR)/ccl.c $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c $(SRC_DIR)/ccl.c -dfa.$(SUF) : $(SRC_DIR)/dfa.c $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c $(SRC_DIR)/dfa.c -ecs.$(SUF) : $(SRC_DIR)/ecs.c $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c $(SRC_DIR)/ecs.c -gen.$(SUF) : $(SRC_DIR)/gen.c $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c $(SRC_DIR)/gen.c -misc.$(SUF) : $(SRC_DIR)/misc.c $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c $(SRC_DIR)/misc.c -nfa.$(SUF) : $(SRC_DIR)/nfa.c $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c $(SRC_DIR)/nfa.c -parse.$(SUF) : parse.c $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c parse.c -sym.$(SUF) : $(SRC_DIR)/sym.c $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c $(SRC_DIR)/sym.c -tblcmp.$(SUF) : $(SRC_DIR)/tblcmp.c $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c $(SRC_DIR)/tblcmp.c -yylex.$(SUF) : $(SRC_DIR)/yylex.c $(SRC_DIR)/flexdef.h - $(CC) $(CFLAGS) -c $(SRC_DIR)/yylex.c - -LINTFLAGS = $(LINTOPTIONS) $(INCLUDES) -lint : $(FLEX_C_SOURCES) - $(LINT) $(LINTFLAGS) $(FLEX_C_SOURCES) - -firstinstall: first_flex $(SRC_DIR)/flex.skel - rm -f $(BINDIR)/flex - cp flex $(BINDIR)/flex - if [ $(DO_MACHINE_INDEP) = y ] ; \ - then cp $(SRC_DIR)/flex.skel $(AUXDIR)/flex.skel ; \ - mk_manpage $(SRC_DIR)/flex.1 $(TARGET_HOME) ; \ - mk_manpage $(SRC_DIR)/flexdoc.1 $(TARGET_HOME) ; \ - fi - -install: flex $(SRC_DIR)/flex.skel - rm -f $(BINDIR)/flex - cp flex $(BINDIR)/flex - if [ $(DO_MACHINE_INDEP) = y ] ; \ - then cp $(SRC_DIR)/flex.skel $(AUXDIR)/flex.skel ; \ - mk_manpage $(SRC_DIR)/flex.1 $(TARGET_HOME) ; \ - mk_manpage $(SRC_DIR)/flexdoc.1 $(TARGET_HOME) ; \ - fi - -cmp: flex $(SRC_DIR)/flex.skel - -cmp flex $(BINDIR)/flex - -cmp $(SRC_DIR)/flex.skel $(AUXDIR)/flex.skel - -clean : - rm -f core errs flex *.$(SUF) parse.c *.lint parse.h tags scan.c - -tags : - ctags $(FLEX_C_SOURCES) - -test : flex - ./flex $(FLEX_FLAGS) $(COMPRESSION) scan.l | diff scan.c - - -bigtest : - rm -f scan.c ; $(MAKE) COMPRESSION="-C" test - rm -f scan.c ; $(MAKE) COMPRESSION="-Ce" test - rm -f scan.c ; $(MAKE) COMPRESSION="-Cm" test - rm -f scan.c ; $(MAKE) COMPRESSION="-Cfe" test - rm -f scan.c ; $(MAKE) COMPRESSION="-CFe" test - rm -f scan.c ; $(MAKE) COMPRESSION="-Cf" test - rm -f scan.c ; $(MAKE) COMPRESSION="-CF" test - rm -f scan.c ; $(MAKE) diff --git a/util/flex/scan.l b/util/flex/scan.l deleted file mode 100644 index 75c94b7f5..000000000 --- a/util/flex/scan.l +++ /dev/null @@ -1,533 +0,0 @@ - -/* scan.l - scanner for flex input */ - -%{ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#undef yywrap - -#include "flexdef.h" -#include "parse.h" - -#define ACTION_ECHO fprintf( temp_action_file, "%s", yytext ) -#define MARK_END_OF_PROLOG fprintf( temp_action_file, "%%%% end of prolog\n" ); - -#undef YY_DECL -#define YY_DECL \ - int flexscan() - -#define RETURNCHAR \ - yylval = yytext[0]; \ - return ( CHAR ); - -#define RETURNNAME \ - (void) strcpy( nmstr, (char *) yytext ); \ - return ( NAME ); - -#define PUT_BACK_STRING(str, start) \ - for ( i = strlen( (char *) (str) ) - 1; i >= start; --i ) \ - unput((str)[i]) - -#define CHECK_REJECT(str) \ - if ( all_upper( str ) ) \ - reject = true; - -#define CHECK_YYMORE(str) \ - if ( all_lower( str ) ) \ - yymore_used = true; -%} - -%x SECT2 SECT2PROLOG SECT3 CODEBLOCK PICKUPDEF SC CARETISBOL NUM QUOTE -%x FIRSTCCL CCL ACTION RECOVER BRACEERROR C_COMMENT ACTION_COMMENT -%x ACTION_STRING PERCENT_BRACE_ACTION USED_LIST CODEBLOCK_2 XLATION - -WS [ \t\f]+ -OPTWS [ \t\f]* -NOT_WS [^ \t\f\n] - -NAME [a-z_][a-z_0-9-]* -NOT_NAME [^a-z_\n]+ - -SCNAME {NAME} - -ESCSEQ \\([^\n]|[0-9]{1,3}|x[0-9a-f]{1,2}) - -%% - static int bracelevel, didadef; - int i, indented_code, checking_used, new_xlation; - int doing_codeblock = false; - Char nmdef[MAXLINE], myesc(); - -^{WS} indented_code = true; BEGIN(CODEBLOCK); -^#.*\n ++linenum; /* treat as a comment */ -^"/*" ECHO; BEGIN(C_COMMENT); -^"%s"{NAME}? return ( SCDECL ); -^"%x"{NAME}? return ( XSCDECL ); -^"%{".*\n { - ++linenum; - line_directive_out( stdout ); - indented_code = false; - BEGIN(CODEBLOCK); - } - -{WS} return ( WHITESPACE ); - -^"%%".* { - sectnum = 2; - line_directive_out( stdout ); - BEGIN(SECT2PROLOG); - return ( SECTEND ); - } - -^"%used" { - pinpoint_message( "warning - %%used/%%unused have been deprecated" ); - checking_used = REALLY_USED; BEGIN(USED_LIST); - } -^"%unused" { - checking_used = REALLY_NOT_USED; BEGIN(USED_LIST); - pinpoint_message( "warning - %%used/%%unused have been deprecated" ); - checking_used = REALLY_NOT_USED; BEGIN(USED_LIST); - } - - -^"%"[aeknopt]" ".*\n { -#ifdef NOTDEF - fprintf( stderr, - "old-style lex command at line %d ignored:\n\t%s", - linenum, yytext ); -#endif - ++linenum; - } - -^"%"[cr]{OPTWS} /* ignore old lex directive */ - -%t{OPTWS}\n { - ++linenum; - xlation = - (int *) malloc( sizeof( int ) * (unsigned) csize ); - - if ( ! xlation ) - flexfatal( - "dynamic memory failure building %t table" ); - - for ( i = 0; i < csize; ++i ) - xlation[i] = 0; - - num_xlations = 0; - - BEGIN(XLATION); - } - -^"%"[^sxanpekotcru{}]{OPTWS} synerr( "unrecognized '%' directive" ); - -^{NAME} { - (void) strcpy( nmstr, (char *) yytext ); - didadef = false; - BEGIN(PICKUPDEF); - } - -{SCNAME} RETURNNAME; -^{OPTWS}\n ++linenum; /* allows blank lines in section 1 */ -{OPTWS}\n ++linenum; return ( '\n' ); -. synerr( "illegal character" ); BEGIN(RECOVER); - - -"*/" ECHO; BEGIN(INITIAL); -"*/".*\n ++linenum; ECHO; BEGIN(INITIAL); -[^*\n]+ ECHO; -"*" ECHO; -\n ++linenum; ECHO; - - -^"%}".*\n ++linenum; BEGIN(INITIAL); -"reject" ECHO; CHECK_REJECT(yytext); -"yymore" ECHO; CHECK_YYMORE(yytext); -{NAME}|{NOT_NAME}|. ECHO; -\n { - ++linenum; - ECHO; - if ( indented_code ) - BEGIN(INITIAL); - } - - -{WS} /* separates name and definition */ - -{NOT_WS}.* { - (void) strcpy( (char *) nmdef, (char *) yytext ); - - for ( i = strlen( (char *) nmdef ) - 1; - i >= 0 && - nmdef[i] == ' ' || nmdef[i] == '\t'; - --i ) - ; - - nmdef[i + 1] = '\0'; - - ndinstal( nmstr, nmdef ); - didadef = true; - } - -\n { - if ( ! didadef ) - synerr( "incomplete name definition" ); - BEGIN(INITIAL); - ++linenum; - } - -.*\n ++linenum; BEGIN(INITIAL); RETURNNAME; - - -\n ++linenum; BEGIN(INITIAL); -{WS} -"reject" { - if ( all_upper( yytext ) ) - reject_really_used = checking_used; - else - synerr( "unrecognized %used/%unused construct" ); - } -"yymore" { - if ( all_lower( yytext ) ) - yymore_really_used = checking_used; - else - synerr( "unrecognized %used/%unused construct" ); - } -{NOT_WS}+ synerr( "unrecognized %used/%unused construct" ); - - -"%t"{OPTWS}\n ++linenum; BEGIN(INITIAL); -^{OPTWS}[0-9]+ ++num_xlations; new_xlation = true; -^. synerr( "bad row in translation table" ); -{WS} /* ignore whitespace */ - -{ESCSEQ} { - xlation[myesc( yytext )] = - (new_xlation ? num_xlations : -num_xlations); - new_xlation = false; - } -. { - xlation[yytext[0]] = - (new_xlation ? num_xlations : -num_xlations); - new_xlation = false; - } - -\n ++linenum; - - -.*\n/{NOT_WS} { - ++linenum; - ACTION_ECHO; - MARK_END_OF_PROLOG; - BEGIN(SECT2); - } - -.*\n ++linenum; ACTION_ECHO; - -<> MARK_END_OF_PROLOG; yyterminate(); - -^{OPTWS}\n ++linenum; /* allow blank lines in section 2 */ - -^({WS}|"%{") { - indented_code = (yytext[0] != '%'); - doing_codeblock = true; - bracelevel = 1; - - if ( indented_code ) - ACTION_ECHO; - - BEGIN(CODEBLOCK_2); - } - -"<" BEGIN(SC); return ( '<' ); -^"^" return ( '^' ); -\" BEGIN(QUOTE); return ( '"' ); -"{"/[0-9] BEGIN(NUM); return ( '{' ); -"{"[^0-9\n][^}\n]* BEGIN(BRACEERROR); -"$"/[ \t\n] return ( '$' ); - -{WS}"%{" { - bracelevel = 1; - BEGIN(PERCENT_BRACE_ACTION); - return ( '\n' ); - } -{WS}"|".*\n continued_action = true; ++linenum; return ( '\n' ); - -{WS} { - /* this rule is separate from the one below because - * otherwise we get variable trailing context, so - * we can't build the scanner using -{f,F} - */ - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); - return ( '\n' ); - } - -{OPTWS}/\n { - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); - return ( '\n' ); - } - -^{OPTWS}\n ++linenum; return ( '\n' ); - -"<>" return ( EOF_OP ); - -^"%%".* { - sectnum = 3; - BEGIN(SECT3); - return ( EOF ); /* to stop the parser */ - } - -"["([^\\\]\n]|{ESCSEQ})+"]" { - int cclval; - - (void) strcpy( nmstr, (char *) yytext ); - - /* check to see if we've already encountered this ccl */ - if ( (cclval = ccllookup( (Char *) nmstr )) ) - { - yylval = cclval; - ++cclreuse; - return ( PREVCCL ); - } - else - { - /* we fudge a bit. We know that this ccl will - * soon be numbered as lastccl + 1 by cclinit - */ - cclinstal( (Char *) nmstr, lastccl + 1 ); - - /* push back everything but the leading bracket - * so the ccl can be rescanned - */ - PUT_BACK_STRING((Char *) nmstr, 1); - - BEGIN(FIRSTCCL); - return ( '[' ); - } - } - -"{"{NAME}"}" { - register Char *nmdefptr; - Char *ndlookup(); - - (void) strcpy( nmstr, (char *) yytext ); - nmstr[yyleng - 1] = '\0'; /* chop trailing brace */ - - /* lookup from "nmstr + 1" to chop leading brace */ - if ( ! (nmdefptr = ndlookup( nmstr + 1 )) ) - synerr( "undefined {name}" ); - - else - { /* push back name surrounded by ()'s */ - unput(')'); - PUT_BACK_STRING(nmdefptr, 0); - unput('('); - } - } - -[/|*+?.()] return ( yytext[0] ); -. RETURNCHAR; -\n ++linenum; return ( '\n' ); - - -"," return ( ',' ); -">" BEGIN(SECT2); return ( '>' ); -">"/"^" BEGIN(CARETISBOL); return ( '>' ); -{SCNAME} RETURNNAME; -. synerr( "bad start condition name" ); - -"^" BEGIN(SECT2); return ( '^' ); - - -[^"\n] RETURNCHAR; -\" BEGIN(SECT2); return ( '"' ); - -\n { - synerr( "missing quote" ); - BEGIN(SECT2); - ++linenum; - return ( '"' ); - } - - -"^"/[^-\n] BEGIN(CCL); return ( '^' ); -"^"/- return ( '^' ); -- BEGIN(CCL); yylval = '-'; return ( CHAR ); -. BEGIN(CCL); RETURNCHAR; - --/[^\]\n] return ( '-' ); -[^\]\n] RETURNCHAR; -"]" BEGIN(SECT2); return ( ']' ); - - -[0-9]+ { - yylval = myctoi( yytext ); - return ( NUMBER ); - } - -"," return ( ',' ); -"}" BEGIN(SECT2); return ( '}' ); - -. { - synerr( "bad character inside {}'s" ); - BEGIN(SECT2); - return ( '}' ); - } - -\n { - synerr( "missing }" ); - BEGIN(SECT2); - ++linenum; - return ( '}' ); - } - - -"}" synerr( "bad name in {}'s" ); BEGIN(SECT2); -\n synerr( "missing }" ); ++linenum; BEGIN(SECT2); - - -{OPTWS}"%}".* bracelevel = 0; -"reject" { - ACTION_ECHO; - CHECK_REJECT(yytext); - } -"yymore" { - ACTION_ECHO; - CHECK_YYMORE(yytext); - } -{NAME}|{NOT_NAME}|. ACTION_ECHO; -\n { - ++linenum; - ACTION_ECHO; - if ( bracelevel == 0 || - (doing_codeblock && indented_code) ) - { - if ( ! doing_codeblock ) - fputs( "\tYY_BREAK\n", temp_action_file ); - - doing_codeblock = false; - BEGIN(SECT2); - } - } - - - /* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */ -"{" ACTION_ECHO; ++bracelevel; -"}" ACTION_ECHO; --bracelevel; -[^a-z_{}"'/\n]+ ACTION_ECHO; -{NAME} ACTION_ECHO; -"/*" ACTION_ECHO; BEGIN(ACTION_COMMENT); -"'"([^'\\\n]|\\.)*"'" ACTION_ECHO; /* character constant */ -\" ACTION_ECHO; BEGIN(ACTION_STRING); -\n { - ++linenum; - ACTION_ECHO; - if ( bracelevel == 0 ) - { - fputs( "\tYY_BREAK\n", temp_action_file ); - BEGIN(SECT2); - } - } -. ACTION_ECHO; - -"*/" ACTION_ECHO; BEGIN(ACTION); -[^*\n]+ ACTION_ECHO; -"*" ACTION_ECHO; -\n ++linenum; ACTION_ECHO; -. ACTION_ECHO; - -[^"\\\n]+ ACTION_ECHO; -\\. ACTION_ECHO; -\n ++linenum; ACTION_ECHO; -\" ACTION_ECHO; BEGIN(ACTION); -. ACTION_ECHO; - -<> { - synerr( "EOF encountered inside an action" ); - yyterminate(); - } - - -{ESCSEQ} { - yylval = myesc( yytext ); - return ( CHAR ); - } - -{ESCSEQ} { - yylval = myesc( yytext ); - BEGIN(CCL); - return ( CHAR ); - } - - -.*(\n?) ECHO; -%% - - -int yywrap() - - { - if ( --num_input_files > 0 ) - { - set_input_file( *++input_files ); - return ( 0 ); - } - - else - return ( 1 ); - } - - -/* set_input_file - open the given file (if NULL, stdin) for scanning */ - -void set_input_file( file ) -char *file; - - { - if ( file ) - { - infilename = file; - yyin = fopen( infilename, "r" ); - - if ( yyin == NULL ) - lerrsf( "can't open %s", file ); - } - - else - { - yyin = stdin; - infilename = ""; - } - } diff --git a/util/flex/sym.c b/util/flex/sym.c deleted file mode 100644 index b5326ba29..000000000 --- a/util/flex/sym.c +++ /dev/null @@ -1,315 +0,0 @@ -/* sym - symbol table routines */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#include "flexdef.h" - - -/* declare functions that have forward references */ - -int hashfunct PROTO((register char[], int)); - - -struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE]; -struct hash_entry *sctbl[START_COND_HASH_SIZE]; -struct hash_entry *ccltab[CCL_HASH_SIZE]; - -struct hash_entry *findsym(); - - -/* addsym - add symbol and definitions to symbol table - * - * synopsis - * char sym[], *str_def; - * int int_def; - * hash_table table; - * int table_size; - * 0 / -1 = addsym( sym, def, int_def, table, table_size ); - * - * -1 is returned if the symbol already exists, and the change not made. - */ - -int addsym( sym, str_def, int_def, table, table_size ) -register char sym[]; -char *str_def; -int int_def; -hash_table table; -int table_size; - - { - int hash_val = hashfunct( sym, table_size ); - register struct hash_entry *sym_entry = table[hash_val]; - register struct hash_entry *new_entry; - register struct hash_entry *successor; - - while ( sym_entry ) - { - if ( ! strcmp( sym, sym_entry->name ) ) - { /* entry already exists */ - return ( -1 ); - } - - sym_entry = sym_entry->next; - } - - /* create new entry */ - new_entry = (struct hash_entry *) malloc( sizeof( struct hash_entry ) ); - - if ( new_entry == NULL ) - flexfatal( "symbol table memory allocation failed" ); - - if ( (successor = table[hash_val]) ) - { - new_entry->next = successor; - successor->prev = new_entry; - } - else - new_entry->next = NULL; - - new_entry->prev = NULL; - new_entry->name = sym; - new_entry->str_val = str_def; - new_entry->int_val = int_def; - - table[hash_val] = new_entry; - - return ( 0 ); - } - - -/* cclinstal - save the text of a character class - * - * synopsis - * Char ccltxt[]; - * int cclnum; - * cclinstal( ccltxt, cclnum ); - */ - -void cclinstal( ccltxt, cclnum ) -Char ccltxt[]; -int cclnum; - - { - /* we don't bother checking the return status because we are not called - * unless the symbol is new - */ - Char *copy_unsigned_string(); - - (void) addsym( (char *) copy_unsigned_string( ccltxt ), (char *) 0, cclnum, - ccltab, CCL_HASH_SIZE ); - } - - -/* ccllookup - lookup the number associated with character class text - * - * synopsis - * Char ccltxt[]; - * int ccllookup, cclval; - * cclval/0 = ccllookup( ccltxt ); - */ - -int ccllookup( ccltxt ) -Char ccltxt[]; - - { - return ( findsym( (char *) ccltxt, ccltab, CCL_HASH_SIZE )->int_val ); - } - - -/* findsym - find symbol in symbol table - * - * synopsis - * char sym[]; - * hash_table table; - * int table_size; - * struct hash_entry *sym_entry, *findsym(); - * sym_entry = findsym( sym, table, table_size ); - */ - -struct hash_entry *findsym( sym, table, table_size ) -register char sym[]; -hash_table table; -int table_size; - - { - register struct hash_entry *sym_entry = table[hashfunct( sym, table_size )]; - static struct hash_entry empty_entry = - { - (struct hash_entry *) 0, (struct hash_entry *) 0, NULL, NULL, 0, - } ; - - while ( sym_entry ) - { - if ( ! strcmp( sym, sym_entry->name ) ) - return ( sym_entry ); - sym_entry = sym_entry->next; - } - - return ( &empty_entry ); - } - - -/* hashfunct - compute the hash value for "str" and hash size "hash_size" - * - * synopsis - * char str[]; - * int hash_size, hash_val; - * hash_val = hashfunct( str, hash_size ); - */ - -int hashfunct( str, hash_size ) -register char str[]; -int hash_size; - - { - register int hashval; - register int locstr; - - hashval = 0; - locstr = 0; - - while ( str[locstr] ) - hashval = ((hashval << 1) + str[locstr++]) % hash_size; - - return ( hashval ); - } - - -/* ndinstal - install a name definition - * - * synopsis - * char nd[]; - * Char def[]; - * ndinstal( nd, def ); - */ - -void ndinstal( nd, def ) -char nd[]; -Char def[]; - - { - char *copy_string(); - Char *copy_unsigned_string(); - - if ( addsym( copy_string( nd ), (char *) copy_unsigned_string( def ), 0, - ndtbl, NAME_TABLE_HASH_SIZE ) ) - synerr( "name defined twice" ); - } - - -/* ndlookup - lookup a name definition - * - * synopsis - * char nd[], *def; - * char *ndlookup(); - * def/NULL = ndlookup( nd ); - */ - -Char *ndlookup( nd ) -char nd[]; - - { - return ( (Char *) findsym( nd, ndtbl, NAME_TABLE_HASH_SIZE )->str_val ); - } - - -/* scinstal - make a start condition - * - * synopsis - * char str[]; - * int xcluflg; - * scinstal( str, xcluflg ); - * - * NOTE - * the start condition is Exclusive if xcluflg is true - */ - -void scinstal( str, xcluflg ) -char str[]; -int xcluflg; - - { - char *copy_string(); - - /* bit of a hack. We know how the default start-condition is - * declared, and don't put out a define for it, because it - * would come out as "#define 0 1" - */ - /* actually, this is no longer the case. The default start-condition - * is now called "INITIAL". But we keep the following for the sake - * of future robustness. - */ - - if ( strcmp( str, "0" ) ) - printf( "#define %s %d\n", str, lastsc ); - - if ( ++lastsc >= current_max_scs ) - { - current_max_scs += MAX_SCS_INCREMENT; - - ++num_reallocs; - - scset = reallocate_integer_array( scset, current_max_scs ); - scbol = reallocate_integer_array( scbol, current_max_scs ); - scxclu = reallocate_integer_array( scxclu, current_max_scs ); - sceof = reallocate_integer_array( sceof, current_max_scs ); - scname = reallocate_char_ptr_array( scname, current_max_scs ); - actvsc = reallocate_integer_array( actvsc, current_max_scs ); - } - - scname[lastsc] = copy_string( str ); - - if ( addsym( scname[lastsc], (char *) 0, lastsc, - sctbl, START_COND_HASH_SIZE ) ) - format_pinpoint_message( "start condition %s declared twice", str ); - - scset[lastsc] = mkstate( SYM_EPSILON ); - scbol[lastsc] = mkstate( SYM_EPSILON ); - scxclu[lastsc] = xcluflg; - sceof[lastsc] = false; - } - - -/* sclookup - lookup the number associated with a start condition - * - * synopsis - * char str[], scnum; - * int sclookup; - * scnum/0 = sclookup( str ); - */ - -int sclookup( str ) -char str[]; - - { - return ( findsym( str, sctbl, START_COND_HASH_SIZE )->int_val ); - } diff --git a/util/flex/tblcmp.c b/util/flex/tblcmp.c deleted file mode 100644 index 887ac1c5d..000000000 --- a/util/flex/tblcmp.c +++ /dev/null @@ -1,932 +0,0 @@ -/* tblcmp - table compression routines */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#include "flexdef.h" - - -/* declarations for functions that have forward references */ - -void mkentry PROTO((register int*, int, int, int, int)); -void mkprot PROTO((int[], int, int)); -void mktemplate PROTO((int[], int, int)); -void mv2front PROTO((int)); -int tbldiff PROTO((int[], int, int[])); - - -/* bldtbl - build table entries for dfa state - * - * synopsis - * int state[numecs], statenum, totaltrans, comstate, comfreq; - * bldtbl( state, statenum, totaltrans, comstate, comfreq ); - * - * State is the statenum'th dfa state. It is indexed by equivalence class and - * gives the number of the state to enter for a given equivalence class. - * totaltrans is the total number of transitions out of the state. Comstate - * is that state which is the destination of the most transitions out of State. - * Comfreq is how many transitions there are out of State to Comstate. - * - * A note on terminology: - * "protos" are transition tables which have a high probability of - * either being redundant (a state processed later will have an identical - * transition table) or nearly redundant (a state processed later will have - * many of the same out-transitions). A "most recently used" queue of - * protos is kept around with the hope that most states will find a proto - * which is similar enough to be usable, and therefore compacting the - * output tables. - * "templates" are a special type of proto. If a transition table is - * homogeneous or nearly homogeneous (all transitions go to the same - * destination) then the odds are good that future states will also go - * to the same destination state on basically the same character set. - * These homogeneous states are so common when dealing with large rule - * sets that they merit special attention. If the transition table were - * simply made into a proto, then (typically) each subsequent, similar - * state will differ from the proto for two out-transitions. One of these - * out-transitions will be that character on which the proto does not go - * to the common destination, and one will be that character on which the - * state does not go to the common destination. Templates, on the other - * hand, go to the common state on EVERY transition character, and therefore - * cost only one difference. - */ - -void bldtbl( state, statenum, totaltrans, comstate, comfreq ) -int state[], statenum, totaltrans, comstate, comfreq; - - { - int extptr, extrct[2][CSIZE + 1]; - int mindiff, minprot, i, d; - int checkcom; - - /* If extptr is 0 then the first array of extrct holds the result of the - * "best difference" to date, which is those transitions which occur in - * "state" but not in the proto which, to date, has the fewest differences - * between itself and "state". If extptr is 1 then the second array of - * extrct hold the best difference. The two arrays are toggled - * between so that the best difference to date can be kept around and - * also a difference just created by checking against a candidate "best" - * proto. - */ - - extptr = 0; - - /* if the state has too few out-transitions, don't bother trying to - * compact its tables - */ - - if ( (totaltrans * 100) < (numecs * PROTO_SIZE_PERCENTAGE) ) - mkentry( state, numecs, statenum, JAMSTATE, totaltrans ); - - else - { - /* checkcom is true if we should only check "state" against - * protos which have the same "comstate" value - */ - - checkcom = comfreq * 100 > totaltrans * CHECK_COM_PERCENTAGE; - - minprot = firstprot; - mindiff = totaltrans; - - if ( checkcom ) - { - /* find first proto which has the same "comstate" */ - for ( i = firstprot; i != NIL; i = protnext[i] ) - if ( protcomst[i] == comstate ) - { - minprot = i; - mindiff = tbldiff( state, minprot, extrct[extptr] ); - break; - } - } - - else - { - /* since we've decided that the most common destination out - * of "state" does not occur with a high enough frequency, - * we set the "comstate" to zero, assuring that if this state - * is entered into the proto list, it will not be considered - * a template. - */ - comstate = 0; - - if ( firstprot != NIL ) - { - minprot = firstprot; - mindiff = tbldiff( state, minprot, extrct[extptr] ); - } - } - - /* we now have the first interesting proto in "minprot". If - * it matches within the tolerances set for the first proto, - * we don't want to bother scanning the rest of the proto list - * to see if we have any other reasonable matches. - */ - - if ( mindiff * 100 > totaltrans * FIRST_MATCH_DIFF_PERCENTAGE ) - { /* not a good enough match. Scan the rest of the protos */ - for ( i = minprot; i != NIL; i = protnext[i] ) - { - d = tbldiff( state, i, extrct[1 - extptr] ); - if ( d < mindiff ) - { - extptr = 1 - extptr; - mindiff = d; - minprot = i; - } - } - } - - /* check if the proto we've decided on as our best bet is close - * enough to the state we want to match to be usable - */ - - if ( mindiff * 100 > totaltrans * ACCEPTABLE_DIFF_PERCENTAGE ) - { - /* no good. If the state is homogeneous enough, we make a - * template out of it. Otherwise, we make a proto. - */ - - if ( comfreq * 100 >= totaltrans * TEMPLATE_SAME_PERCENTAGE ) - mktemplate( state, statenum, comstate ); - - else - { - mkprot( state, statenum, comstate ); - mkentry( state, numecs, statenum, JAMSTATE, totaltrans ); - } - } - - else - { /* use the proto */ - mkentry( extrct[extptr], numecs, statenum, - prottbl[minprot], mindiff ); - - /* if this state was sufficiently different from the proto - * we built it from, make it, too, a proto - */ - - if ( mindiff * 100 >= totaltrans * NEW_PROTO_DIFF_PERCENTAGE ) - mkprot( state, statenum, comstate ); - - /* since mkprot added a new proto to the proto queue, it's possible - * that "minprot" is no longer on the proto queue (if it happened - * to have been the last entry, it would have been bumped off). - * If it's not there, then the new proto took its physical place - * (though logically the new proto is at the beginning of the - * queue), so in that case the following call will do nothing. - */ - - mv2front( minprot ); - } - } - } - - -/* cmptmps - compress template table entries - * - * synopsis - * cmptmps(); - * - * template tables are compressed by using the 'template equivalence - * classes', which are collections of transition character equivalence - * classes which always appear together in templates - really meta-equivalence - * classes. until this point, the tables for templates have been stored - * up at the top end of the nxt array; they will now be compressed and have - * table entries made for them. - */ - -void cmptmps() - - { - int tmpstorage[CSIZE + 1]; - register int *tmp = tmpstorage, i, j; - int totaltrans, trans; - - peakpairs = numtemps * numecs + tblend; - - if ( usemecs ) - { - /* create equivalence classes base on data gathered on template - * transitions - */ - - nummecs = cre8ecs( tecfwd, tecbck, numecs ); - } - - else - nummecs = numecs; - - if ( lastdfa + numtemps + 1 >= current_max_dfas ) - increase_max_dfas(); - - /* loop through each template */ - - for ( i = 1; i <= numtemps; ++i ) - { - totaltrans = 0; /* number of non-jam transitions out of this template */ - - for ( j = 1; j <= numecs; ++j ) - { - trans = tnxt[numecs * i + j]; - - if ( usemecs ) - { - /* the absolute value of tecbck is the meta-equivalence class - * of a given equivalence class, as set up by cre8ecs - */ - if ( tecbck[j] > 0 ) - { - tmp[tecbck[j]] = trans; - - if ( trans > 0 ) - ++totaltrans; - } - } - - else - { - tmp[j] = trans; - - if ( trans > 0 ) - ++totaltrans; - } - } - - /* it is assumed (in a rather subtle way) in the skeleton that - * if we're using meta-equivalence classes, the def[] entry for - * all templates is the jam template, i.e., templates never default - * to other non-jam table entries (e.g., another template) - */ - - /* leave room for the jam-state after the last real state */ - mkentry( tmp, nummecs, lastdfa + i + 1, JAMSTATE, totaltrans ); - } - } - -#ifdef ACK_MOD -static void bzero(p, cnt) -register char *p; -register int cnt; - { - while (cnt-- > 0) *p++ = '\0'; - } -#endif /* ACK_MOD */ - -/* expand_nxt_chk - expand the next check arrays */ - -void expand_nxt_chk() - - { - register int old_max = current_max_xpairs; - - current_max_xpairs += MAX_XPAIRS_INCREMENT; - - ++num_reallocs; - - nxt = reallocate_integer_array( nxt, current_max_xpairs ); - chk = reallocate_integer_array( chk, current_max_xpairs ); - - bzero( (char *) (chk + old_max), - MAX_XPAIRS_INCREMENT * sizeof( int ) / sizeof( char ) ); - } - - -/* find_table_space - finds a space in the table for a state to be placed - * - * synopsis - * int *state, numtrans, block_start; - * int find_table_space(); - * - * block_start = find_table_space( state, numtrans ); - * - * State is the state to be added to the full speed transition table. - * Numtrans is the number of out-transitions for the state. - * - * find_table_space() returns the position of the start of the first block (in - * chk) able to accommodate the state - * - * In determining if a state will or will not fit, find_table_space() must take - * into account the fact that an end-of-buffer state will be added at [0], - * and an action number will be added in [-1]. - */ - -int find_table_space( state, numtrans ) -int *state, numtrans; - - { - /* firstfree is the position of the first possible occurrence of two - * consecutive unused records in the chk and nxt arrays - */ - register int i; - register int *state_ptr, *chk_ptr; - register int *ptr_to_last_entry_in_state; - - /* if there are too many out-transitions, put the state at the end of - * nxt and chk - */ - if ( numtrans > MAX_XTIONS_FULL_INTERIOR_FIT ) - { - /* if table is empty, return the first available spot in chk/nxt, - * which should be 1 - */ - if ( tblend < 2 ) - return ( 1 ); - - i = tblend - numecs; /* start searching for table space near the - * end of chk/nxt arrays - */ - } - - else - i = firstfree; /* start searching for table space from the - * beginning (skipping only the elements - * which will definitely not hold the new - * state) - */ - - while ( 1 ) /* loops until a space is found */ - { - if ( i + numecs > current_max_xpairs ) - expand_nxt_chk(); - - /* loops until space for end-of-buffer and action number are found */ - while ( 1 ) - { - if ( chk[i - 1] == 0 ) /* check for action number space */ - { - if ( chk[i] == 0 ) /* check for end-of-buffer space */ - break; - - else - i += 2; /* since i != 0, there is no use checking to - * see if (++i) - 1 == 0, because that's the - * same as i == 0, so we skip a space - */ - } - - else - ++i; - - if ( i + numecs > current_max_xpairs ) - expand_nxt_chk(); - } - - /* if we started search from the beginning, store the new firstfree for - * the next call of find_table_space() - */ - if ( numtrans <= MAX_XTIONS_FULL_INTERIOR_FIT ) - firstfree = i + 1; - - /* check to see if all elements in chk (and therefore nxt) that are - * needed for the new state have not yet been taken - */ - - state_ptr = &state[1]; - ptr_to_last_entry_in_state = &chk[i + numecs + 1]; - - for ( chk_ptr = &chk[i + 1]; chk_ptr != ptr_to_last_entry_in_state; - ++chk_ptr ) - if ( *(state_ptr++) != 0 && *chk_ptr != 0 ) - break; - - if ( chk_ptr == ptr_to_last_entry_in_state ) - return ( i ); - - else - ++i; - } - } - - -/* inittbl - initialize transition tables - * - * synopsis - * inittbl(); - * - * Initializes "firstfree" to be one beyond the end of the table. Initializes - * all "chk" entries to be zero. Note that templates are built in their - * own tbase/tdef tables. They are shifted down to be contiguous - * with the non-template entries during table generation. - */ -void inittbl() - - { - register int i; - - bzero( (char *) chk, current_max_xpairs * sizeof( int ) / sizeof( char ) ); - - tblend = 0; - firstfree = tblend + 1; - numtemps = 0; - - if ( usemecs ) - { - /* set up doubly-linked meta-equivalence classes - * these are sets of equivalence classes which all have identical - * transitions out of TEMPLATES - */ - - tecbck[1] = NIL; - - for ( i = 2; i <= numecs; ++i ) - { - tecbck[i] = i - 1; - tecfwd[i - 1] = i; - } - - tecfwd[numecs] = NIL; - } - } - - -/* mkdeftbl - make the default, "jam" table entries - * - * synopsis - * mkdeftbl(); - */ - -void mkdeftbl() - - { - int i; - - jamstate = lastdfa + 1; - - ++tblend; /* room for transition on end-of-buffer character */ - - if ( tblend + numecs > current_max_xpairs ) - expand_nxt_chk(); - - /* add in default end-of-buffer transition */ - nxt[tblend] = end_of_buffer_state; - chk[tblend] = jamstate; - - for ( i = 1; i <= numecs; ++i ) - { - nxt[tblend + i] = 0; - chk[tblend + i] = jamstate; - } - - jambase = tblend; - - base[jamstate] = jambase; - def[jamstate] = 0; - - tblend += numecs; - ++numtemps; - } - - -/* mkentry - create base/def and nxt/chk entries for transition array - * - * synopsis - * int state[numchars + 1], numchars, statenum, deflink, totaltrans; - * mkentry( state, numchars, statenum, deflink, totaltrans ); - * - * "state" is a transition array "numchars" characters in size, "statenum" - * is the offset to be used into the base/def tables, and "deflink" is the - * entry to put in the "def" table entry. If "deflink" is equal to - * "JAMSTATE", then no attempt will be made to fit zero entries of "state" - * (i.e., jam entries) into the table. It is assumed that by linking to - * "JAMSTATE" they will be taken care of. In any case, entries in "state" - * marking transitions to "SAME_TRANS" are treated as though they will be - * taken care of by whereever "deflink" points. "totaltrans" is the total - * number of transitions out of the state. If it is below a certain threshold, - * the tables are searched for an interior spot that will accommodate the - * state array. - */ - -void mkentry( state, numchars, statenum, deflink, totaltrans ) -register int *state; -int numchars, statenum, deflink, totaltrans; - - { - register int minec, maxec, i, baseaddr; - int tblbase, tbllast; - - if ( totaltrans == 0 ) - { /* there are no out-transitions */ - if ( deflink == JAMSTATE ) - base[statenum] = JAMSTATE; - else - base[statenum] = 0; - - def[statenum] = deflink; - return; - } - - for ( minec = 1; minec <= numchars; ++minec ) - { - if ( state[minec] != SAME_TRANS ) - if ( state[minec] != 0 || deflink != JAMSTATE ) - break; - } - - if ( totaltrans == 1 ) - { - /* there's only one out-transition. Save it for later to fill - * in holes in the tables. - */ - stack1( statenum, minec, state[minec], deflink ); - return; - } - - for ( maxec = numchars; maxec > 0; --maxec ) - { - if ( state[maxec] != SAME_TRANS ) - if ( state[maxec] != 0 || deflink != JAMSTATE ) - break; - } - - /* Whether we try to fit the state table in the middle of the table - * entries we have already generated, or if we just take the state - * table at the end of the nxt/chk tables, we must make sure that we - * have a valid base address (i.e., non-negative). Note that not only are - * negative base addresses dangerous at run-time (because indexing the - * next array with one and a low-valued character might generate an - * array-out-of-bounds error message), but at compile-time negative - * base addresses denote TEMPLATES. - */ - - /* find the first transition of state that we need to worry about. */ - if ( totaltrans * 100 <= numchars * INTERIOR_FIT_PERCENTAGE ) - { /* attempt to squeeze it into the middle of the tabls */ - baseaddr = firstfree; - - while ( baseaddr < minec ) - { - /* using baseaddr would result in a negative base address below - * find the next free slot - */ - for ( ++baseaddr; chk[baseaddr] != 0; ++baseaddr ) - ; - } - - if ( baseaddr + maxec - minec >= current_max_xpairs ) - expand_nxt_chk(); - - for ( i = minec; i <= maxec; ++i ) - if ( state[i] != SAME_TRANS ) - if ( state[i] != 0 || deflink != JAMSTATE ) - if ( chk[baseaddr + i - minec] != 0 ) - { /* baseaddr unsuitable - find another */ - for ( ++baseaddr; - baseaddr < current_max_xpairs && - chk[baseaddr] != 0; - ++baseaddr ) - ; - - if ( baseaddr + maxec - minec >= current_max_xpairs ) - expand_nxt_chk(); - - /* reset the loop counter so we'll start all - * over again next time it's incremented - */ - - i = minec - 1; - } - } - - else - { - /* ensure that the base address we eventually generate is - * non-negative - */ - baseaddr = max( tblend + 1, minec ); - } - - tblbase = baseaddr - minec; - tbllast = tblbase + maxec; - - if ( tbllast >= current_max_xpairs ) - expand_nxt_chk(); - - base[statenum] = tblbase; - def[statenum] = deflink; - - for ( i = minec; i <= maxec; ++i ) - if ( state[i] != SAME_TRANS ) - if ( state[i] != 0 || deflink != JAMSTATE ) - { - nxt[tblbase + i] = state[i]; - chk[tblbase + i] = statenum; - } - - if ( baseaddr == firstfree ) - /* find next free slot in tables */ - for ( ++firstfree; chk[firstfree] != 0; ++firstfree ) - ; - - tblend = max( tblend, tbllast ); - } - - -/* mk1tbl - create table entries for a state (or state fragment) which - * has only one out-transition - * - * synopsis - * int state, sym, onenxt, onedef; - * mk1tbl( state, sym, onenxt, onedef ); - */ - -void mk1tbl( state, sym, onenxt, onedef ) -int state, sym, onenxt, onedef; - - { - if ( firstfree < sym ) - firstfree = sym; - - while ( chk[firstfree] != 0 ) - if ( ++firstfree >= current_max_xpairs ) - expand_nxt_chk(); - - base[state] = firstfree - sym; - def[state] = onedef; - chk[firstfree] = state; - nxt[firstfree] = onenxt; - - if ( firstfree > tblend ) - { - tblend = firstfree++; - - if ( firstfree >= current_max_xpairs ) - expand_nxt_chk(); - } - } - - -/* mkprot - create new proto entry - * - * synopsis - * int state[], statenum, comstate; - * mkprot( state, statenum, comstate ); - */ - -void mkprot( state, statenum, comstate ) -int state[], statenum, comstate; - - { - int i, slot, tblbase; - - if ( ++numprots >= MSP || numecs * numprots >= PROT_SAVE_SIZE ) - { - /* gotta make room for the new proto by dropping last entry in - * the queue - */ - slot = lastprot; - lastprot = protprev[lastprot]; - protnext[lastprot] = NIL; - } - - else - slot = numprots; - - protnext[slot] = firstprot; - - if ( firstprot != NIL ) - protprev[firstprot] = slot; - - firstprot = slot; - prottbl[slot] = statenum; - protcomst[slot] = comstate; - - /* copy state into save area so it can be compared with rapidly */ - tblbase = numecs * (slot - 1); - - for ( i = 1; i <= numecs; ++i ) - protsave[tblbase + i] = state[i]; - } - - -/* mktemplate - create a template entry based on a state, and connect the state - * to it - * - * synopsis - * int state[], statenum, comstate, totaltrans; - * mktemplate( state, statenum, comstate, totaltrans ); - */ - -void mktemplate( state, statenum, comstate ) -int state[], statenum, comstate; - - { - int i, numdiff, tmpbase, tmp[CSIZE + 1]; - Char transset[CSIZE + 1]; - int tsptr; - - ++numtemps; - - tsptr = 0; - - /* calculate where we will temporarily store the transition table - * of the template in the tnxt[] array. The final transition table - * gets created by cmptmps() - */ - - tmpbase = numtemps * numecs; - - if ( tmpbase + numecs >= current_max_template_xpairs ) - { - current_max_template_xpairs += MAX_TEMPLATE_XPAIRS_INCREMENT; - - ++num_reallocs; - - tnxt = reallocate_integer_array( tnxt, current_max_template_xpairs ); - } - - for ( i = 1; i <= numecs; ++i ) - if ( state[i] == 0 ) - tnxt[tmpbase + i] = 0; - else - { - transset[tsptr++] = i; - tnxt[tmpbase + i] = comstate; - } - - if ( usemecs ) - mkeccl( transset, tsptr, tecfwd, tecbck, numecs, 0 ); - - mkprot( tnxt + tmpbase, -numtemps, comstate ); - - /* we rely on the fact that mkprot adds things to the beginning - * of the proto queue - */ - - numdiff = tbldiff( state, firstprot, tmp ); - mkentry( tmp, numecs, statenum, -numtemps, numdiff ); - } - - -/* mv2front - move proto queue element to front of queue - * - * synopsis - * int qelm; - * mv2front( qelm ); - */ - -void mv2front( qelm ) -int qelm; - - { - if ( firstprot != qelm ) - { - if ( qelm == lastprot ) - lastprot = protprev[lastprot]; - - protnext[protprev[qelm]] = protnext[qelm]; - - if ( protnext[qelm] != NIL ) - protprev[protnext[qelm]] = protprev[qelm]; - - protprev[qelm] = NIL; - protnext[qelm] = firstprot; - protprev[firstprot] = qelm; - firstprot = qelm; - } - } - - -/* place_state - place a state into full speed transition table - * - * synopsis - * int *state, statenum, transnum; - * place_state( state, statenum, transnum ); - * - * State is the statenum'th state. It is indexed by equivalence class and - * gives the number of the state to enter for a given equivalence class. - * Transnum is the number of out-transitions for the state. - */ - -void place_state( state, statenum, transnum ) -int *state, statenum, transnum; - - { - register int i; - register int *state_ptr; - int position = find_table_space( state, transnum ); - - /* base is the table of start positions */ - base[statenum] = position; - - /* put in action number marker; this non-zero number makes sure that - * find_table_space() knows that this position in chk/nxt is taken - * and should not be used for another accepting number in another state - */ - chk[position - 1] = 1; - - /* put in end-of-buffer marker; this is for the same purposes as above */ - chk[position] = 1; - - /* place the state into chk and nxt */ - state_ptr = &state[1]; - - for ( i = 1; i <= numecs; ++i, ++state_ptr ) - if ( *state_ptr != 0 ) - { - chk[position + i] = i; - nxt[position + i] = *state_ptr; - } - - if ( position + numecs > tblend ) - tblend = position + numecs; - } - - -/* stack1 - save states with only one out-transition to be processed later - * - * synopsis - * int statenum, sym, nextstate, deflink; - * stack1( statenum, sym, nextstate, deflink ); - * - * if there's room for another state one the "one-transition" stack, the - * state is pushed onto it, to be processed later by mk1tbl. If there's - * no room, we process the sucker right now. - */ - -void stack1( statenum, sym, nextstate, deflink ) -int statenum, sym, nextstate, deflink; - - { - if ( onesp >= ONE_STACK_SIZE - 1 ) - mk1tbl( statenum, sym, nextstate, deflink ); - - else - { - ++onesp; - onestate[onesp] = statenum; - onesym[onesp] = sym; - onenext[onesp] = nextstate; - onedef[onesp] = deflink; - } - } - - -/* tbldiff - compute differences between two state tables - * - * synopsis - * int state[], pr, ext[]; - * int tbldiff, numdifferences; - * numdifferences = tbldiff( state, pr, ext ) - * - * "state" is the state array which is to be extracted from the pr'th - * proto. "pr" is both the number of the proto we are extracting from - * and an index into the save area where we can find the proto's complete - * state table. Each entry in "state" which differs from the corresponding - * entry of "pr" will appear in "ext". - * Entries which are the same in both "state" and "pr" will be marked - * as transitions to "SAME_TRANS" in "ext". The total number of differences - * between "state" and "pr" is returned as function value. Note that this - * number is "numecs" minus the number of "SAME_TRANS" entries in "ext". - */ - -int tbldiff( state, pr, ext ) -int state[], pr, ext[]; - - { - register int i, *sp = state, *ep = ext, *protp; - register int numdiff = 0; - - protp = &protsave[numecs * (pr - 1)]; - - for ( i = numecs; i > 0; --i ) - { - if ( *++protp == *++sp ) - *++ep = SAME_TRANS; - else - { - *++ep = *sp; - ++numdiff; - } - } - - return ( numdiff ); - } diff --git a/util/flex/yylex.c b/util/flex/yylex.c deleted file mode 100644 index 4e51762fd..000000000 --- a/util/flex/yylex.c +++ /dev/null @@ -1,216 +0,0 @@ -/* yylex - scanner front-end for flex */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -static char rcsid[] = - "@(#) $Id$ (LBL)"; -#endif - -#include -#include "flexdef.h" -#include "parse.h" - - -/* ANSI C does not guarantee that isascii() is defined */ -#ifndef isascii -#define isascii(c) ((c) <= 0177) -#endif - - -/* yylex - scan for a regular expression token - * - * synopsis - * - * token = yylex(); - * - * token - return token found - */ - -int yylex() - - { - int toktype; - static int beglin = false; - - if ( eofseen ) - toktype = EOF; - else - toktype = flexscan(); - - if ( toktype == EOF || toktype == 0 ) - { - eofseen = 1; - - if ( sectnum == 1 ) - { - synerr( "premature EOF" ); - sectnum = 2; - toktype = SECTEND; - } - - else if ( sectnum == 2 ) - { - sectnum = 3; - toktype = 0; - } - - else - toktype = 0; - } - - if ( trace ) - { - if ( beglin ) - { - fprintf( stderr, "%d\t", num_rules + 1 ); - beglin = 0; - } - - switch ( toktype ) - { - case '<': - case '>': - case '^': - case '$': - case '"': - case '[': - case ']': - case '{': - case '}': - case '|': - case '(': - case ')': - case '-': - case '/': - case '\\': - case '?': - case '.': - case '*': - case '+': - case ',': - (void) putc( toktype, stderr ); - break; - - case '\n': - (void) putc( '\n', stderr ); - - if ( sectnum == 2 ) - beglin = 1; - - break; - - case SCDECL: - fputs( "%s", stderr ); - break; - - case XSCDECL: - fputs( "%x", stderr ); - break; - - case WHITESPACE: - (void) putc( ' ', stderr ); - break; - - case SECTEND: - fputs( "%%\n", stderr ); - - /* we set beglin to be true so we'll start - * writing out numbers as we echo rules. flexscan() has - * already assigned sectnum - */ - - if ( sectnum == 2 ) - beglin = 1; - - break; - - case NAME: - fprintf( stderr, "'%s'", nmstr ); - break; - - case CHAR: - switch ( yylval ) - { - case '<': - case '>': - case '^': - case '$': - case '"': - case '[': - case ']': - case '{': - case '}': - case '|': - case '(': - case ')': - case '-': - case '/': - case '\\': - case '?': - case '.': - case '*': - case '+': - case ',': - fprintf( stderr, "\\%c", yylval ); - break; - - default: - if ( ! isascii( yylval ) || ! isprint( yylval ) ) - fprintf( stderr, "\\%.3o", yylval ); - else - (void) putc( yylval, stderr ); - break; - } - - break; - - case NUMBER: - fprintf( stderr, "%d", yylval ); - break; - - case PREVCCL: - fprintf( stderr, "[%d]", yylval ); - break; - - case EOF_OP: - fprintf( stderr, "<>" ); - break; - - case 0: - fprintf( stderr, "End Marker" ); - break; - - default: - fprintf( stderr, "*Something Weird* - tok: %d val: %d\n", - toktype, yylval ); - break; - } - } - - return ( toktype ); - } diff --git a/util/grind/do_comm.c b/util/grind/do_comm.c index 926359b8e..a5aa42f91 100644 --- a/util/grind/do_comm.c +++ b/util/grind/do_comm.c @@ -435,7 +435,7 @@ do_file(p) } return; } - if ((f = fopen(p->t_args[0]->t_str, "r")) == NULL) { + if ((f = fopen(p->t_args[0]->t_str, "rb")) == NULL) { error("could not open %s", p->t_args[0]->t_str); return; } @@ -810,7 +810,7 @@ do_source(p) FILE *old_db_in = db_in; p = p->t_args[0]; - if ((db_in = fopen(p->t_str, "r")) == NULL) { + if ((db_in = fopen(p->t_str, "rb")) == NULL) { db_in = old_db_in; error("could not open %s", p->t_str); return; diff --git a/util/grind/rd.c b/util/grind/rd.c index 13085b55b..301cfe68c 100644 --- a/util/grind/rd.c +++ b/util/grind/rd.c @@ -108,7 +108,7 @@ int rd_open(f) char *f; { - if ((inf = fopen(f, "r")) == NULL) return 0; + if ((inf = fopen(f, "rb")) == NULL) return 0; return 1; } @@ -346,7 +346,7 @@ int rd_open(f) char *f; { - if ((inf = fopen(f, "r")) == NULL) return 0; + if ((inf = fopen(f, "rb")) == NULL) return 0; return 1; } diff --git a/util/int/build.lua b/util/int/build.lua index 7e2a5100a..f1b5264f7 100644 --- a/util/int/build.lua +++ b/util/int/build.lua @@ -87,7 +87,46 @@ clibrary { cprogram { name = "int", srcs = { - "./*.c", + "./alloc.c", + "./core.c", + "./data.c", + "./disassemble.c", + "./do_array.c", + "./do_branch.c", + "./do_comp.c", + "./do_conv.c", + "./do_fpar.c", + "./do_incdec.c", + "./do_intar.c", + "./do_load.c", + "./do_logic.c", + "./do_misc.c", + "./do_proc.c", + "./do_ptrar.c", + "./do_sets.c", + "./do_store.c", + "./do_unsar.c", + "./dump.c", + "./fra.c", + "./global.c", + "./init.c", + "./io.c", + "./log.c", + "./main.c", + "./m_ioctl.c", + "./moncalls.c", + "./monstruct.c", + "./m_sigtrp.c", + "./proctab.c", + "./read.c", + "./rsb.c", + "./segment.c", + "./stack.c", + "./switch.c", + "./tally.c", + "./text.c", + "./trap.c", + "./warn.c", }, deps = { "h+emheaders", diff --git a/util/int/core.c b/util/int/core.c index b9ced3645..f62b1ae2d 100644 --- a/util/int/core.c +++ b/util/int/core.c @@ -14,7 +14,7 @@ void core_dump(void) { FILE *core_file; - core_file = fopen("int.core", "w"); + core_file = fopen("int.core", "wb"); if (!core_file) { /* no point in giving a fatal error again! */ return; diff --git a/util/int/read.c b/util/int/read.c index f699c26df..9ee970e25 100644 --- a/util/int/read.c +++ b/util/int/read.c @@ -61,7 +61,7 @@ PRIVATE long rd_int(size); void rd_open(char *fname) { /* Open loadfile */ - if ((load_fp = fopen(fname, "r")) == NULL) + if ((load_fp = fopen(fname, "rb")) == NULL) { fatal("Cannot open loadfile '%s'", fname); } diff --git a/util/int/tally.c b/util/int/tally.c index f59562478..be8054d86 100644 --- a/util/int/tally.c +++ b/util/int/tally.c @@ -115,7 +115,7 @@ void out_tally(void) if (!*hook) return; - tally_fp = fopen("int.tally", "w"); + tally_fp = fopen("int.tally", "wb"); if (!tally_fp) return; diff --git a/util/led/build.lua b/util/led/build.lua index 02db10c89..efbd4e6a1 100644 --- a/util/led/build.lua +++ b/util/led/build.lua @@ -1,6 +1,20 @@ cprogram { name = "led", - srcs = { "./*.c" }, + srcs = { + "./archive.c", + "./error.c", + "./extract.c", + "./finish.c", + "./main.c", + "./memory.c", + "./output.c", + "./read.c", + "./relocate.c", + "./save.c", + "./scan.c", + "./sym.c", + "./write.c", + }, deps = { "./archive.h", "./const.h", "./debug.h", "./defs.h", "./error.h", "./extract.h", "./finish.h", "./mach.h", diff --git a/util/make/README b/util/make/README index 240615627..e015620de 100644 --- a/util/make/README +++ b/util/make/README @@ -1,45 +1,45 @@ -Following is a repost of the public domain 'make' that I posted -to net.sources a couple of months ago. I have fixed a few bugs, and -added some more features, and the resulting changes amounted to -about as much text as the whole program (hence the repost). - -For those that missed the net.sources posting, this is a public domain -re-implementation of the UNIX make program. There is no manual included; -for documentation, refer to a UNIX manual, or the source. - -Here is a list of the changes made: - -i) If '-' (ignore) or '@' (silent) where used at the start - of a command, their effect was not turned off for the following - commands. -ii) A special target (.SUFFIXES, .PRECIOUS) or a rule (.c.o, .a.o), - if first in the file would be taken as the default target. - This resulted in error messages like "Don't know how to - make .c", because things like .SUFFIXES were being made. - This was further complicated by --- -iii) Special target lines with no dependents (ie. .SUFFIXES:\n) - were not clearing out the existing dependents like - they should. -iv) Default rules could not be redefined because of the error - checking for commands being defined twice. Now you are - allowed to define a target beinging with '.', having - no dependents with commands. -v) The -q option didn't do the time comparison correctly, - or clear the variable used to keep track of this. Thus - it didn't work very well. -vi) The syntax ${..} for macro's supported by UNIX make was - not supported. -vii) There wuz a couple of spelling errors. -viii) When make checked for implicit rules on targets without - a suffix, there were problems. (Note: The ~ feature of - UNIX make wasn't and still isn't supported) -ix) The -n option did not print @ lines like it was supposed to. -x) :: added. (See UNIX manual) -xi) $? added. (see UNIX manual) - -Hacked further by Ceriel Jacobs to make it work better. Use this "make" to -install ACK under Microsoft Xenix V3.2. Some of the makefiles are just too -big for the Xenix "make". Strange, they work on a PDP-11 ... - -Made it almost ISO C90 and POSIX portable by Carl Eric Codere, and -also made it safer by using correct datatypes on some library calls. +Following is a repost of the public domain 'make' that I posted +to net.sources a couple of months ago. I have fixed a few bugs, and +added some more features, and the resulting changes amounted to +about as much text as the whole program (hence the repost). + +For those that missed the net.sources posting, this is a public domain +re-implementation of the UNIX make program. There is no manual included; +for documentation, refer to a UNIX manual, or the source. + +Here is a list of the changes made: + +i) If '-' (ignore) or '@' (silent) where used at the start + of a command, their effect was not turned off for the following + commands. +ii) A special target (.SUFFIXES, .PRECIOUS) or a rule (.c.o, .a.o), + if first in the file would be taken as the default target. + This resulted in error messages like "Don't know how to + make .c", because things like .SUFFIXES were being made. + This was further complicated by --- +iii) Special target lines with no dependents (ie. .SUFFIXES:\n) + were not clearing out the existing dependents like + they should. +iv) Default rules could not be redefined because of the error + checking for commands being defined twice. Now you are + allowed to define a target beinging with '.', having + no dependents with commands. +v) The -q option didn't do the time comparison correctly, + or clear the variable used to keep track of this. Thus + it didn't work very well. +vi) The syntax ${..} for macro's supported by UNIX make was + not supported. +vii) There wuz a couple of spelling errors. +viii) When make checked for implicit rules on targets without + a suffix, there were problems. (Note: The ~ feature of + UNIX make wasn't and still isn't supported) +ix) The -n option did not print @ lines like it was supposed to. +x) :: added. (See UNIX manual) +xi) $? added. (see UNIX manual) + +Hacked further by Ceriel Jacobs to make it work better. Use this "make" to +install ACK under Microsoft Xenix V3.2. Some of the makefiles are just too +big for the Xenix "make". Strange, they work on a PDP-11 ... + +Made it almost ISO C90 and POSIX portable by Carl Eric Codere, and +also made it safer by using correct datatypes on some library calls. diff --git a/util/mcgg/build.lua b/util/mcgg/build.lua index f8055050c..ef90683fd 100644 --- a/util/mcgg/build.lua +++ b/util/mcgg/build.lua @@ -1,13 +1,17 @@ -include("first/yacc.lua") +include("first/bison.lua") flex { name = "flex", - srcs = { "./*.l" }, + srcs = { + "./scan.l", + } } -yacc { - name = "yacc", - srcs = { "./*.y" }, +bison { + name = "bison", + srcs = { + "./gram.y", + } } normalrule { @@ -41,14 +45,14 @@ clibrary { cprogram { name = "mcgg", srcs = { - "./*.c", + "./iburg.c", matching(filenamesof("+flex"), "%.c$"), - matching(filenamesof("+yacc"), "%.c$") + matching(filenamesof("+bison"), "%.c$") }, deps = { "./iburg.h", "+lib", - "+yacc", + "+bison", "modules/src/data+lib", "modules+headers", } diff --git a/util/ncgg/build.lua b/util/ncgg/build.lua index 9441e9f74..c514306b1 100644 --- a/util/ncgg/build.lua +++ b/util/ncgg/build.lua @@ -1,6 +1,6 @@ -include("first/yacc.lua") +include("first/bison.lua") -local cggparser = yacc { +local cggparser = bison { name = "cggparser", srcs = { "./cgg.y" } } @@ -13,21 +13,32 @@ local cgglexer = flex { normalrule { name = "keywords", ins = { - "./cvtkeywords", - "util/cmisc+ed", + "./make_enterkeyw_c.lua", "./keywords", - matching(filenamesof(cggparser), "%.h$") }, outleaves = { "enterkeyw.c" }, commands = { - "%{ins[1]} %{ins[2]} %{ins[3]} %{ins[4]} %{outs[1]}" + "$LUA %{ins[1]} < %{ins[2]} > %{outs[1]}" } } cprogram { name = "ncgg", srcs = concat( - "./*.c", + "./coerc.c", + "./emlookup.c", + "./error.c", + "./expr.c", + "./hall.c", + "./instruct.c", + "./iocc.c", + "./lookup.c", + "./main.c", + "./output.c", + "./set.c", + "./strlookup.c", + "./subr.c", + "./var.c", matching(filenamesof(cggparser), "%.c$"), matching(filenamesof(cgglexer), "%.c$"), "+keywords" diff --git a/util/ncgg/cvtkeywords b/util/ncgg/cvtkeywords deleted file mode 100755 index 46472ecbc..000000000 --- a/util/ncgg/cvtkeywords +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -: '$Id$' - -grep '^#' $3 >tokendefs -$1 -s $2 > $4 <<'!Funky!Stuff!' -g/^#/d -1,$s/\([^ ]*\)[ ][ ]*\(.*\)/ sy_p=lookup("\1",symkeyw,newsymbol);sy_p->sy_value.syv_keywno=\2;/ -1i -#include "lookup.h" -. -.r tokendefs -a - -void enterkeyw(void) { - register symbol *sy_p; - -. -$a -} -. -1,$p -!Funky!Stuff! -rm tokendefs - diff --git a/util/ncgg/make_enterkeyw_c.lua b/util/ncgg/make_enterkeyw_c.lua new file mode 100755 index 000000000..572cbb084 --- /dev/null +++ b/util/ncgg/make_enterkeyw_c.lua @@ -0,0 +1,26 @@ +print([[ +#include "param.h" +#include "lookup.h" +#include "varinfo.h" +#include "instruct.h" +#include "set.h" +#include "expr.h" +#include "iocc.h" +#include "y.tab.h" + +void enterkeyw(void) { +]]) + +for line in io.stdin:lines() do + if not line:find("^#") then + local _, _, w1, w2 = line:find("^(%g+)%s+(%g+)$") + print(string.format([[ + lookup("%s", symkeyw, newsymbol)->sy_value.syv_keywno = %s; + ]], w1, w2)) + end +end + +print([[ +} +]]) + diff --git a/util/opt/build.lua b/util/opt/build.lua index a503a6f35..ec213d879 100644 --- a/util/opt/build.lua +++ b/util/opt/build.lua @@ -1,7 +1,7 @@ -include("first/yacc.lua") +include("first/bison.lua") -yacc { - name = "yacc", +bison { + name = "bison", srcs = { "./mktab.y" } } @@ -19,13 +19,13 @@ local headers = { cprogram { name = "mktab", srcs = { - matching(filenamesof("+yacc"), "%.c$"), + matching(filenamesof("+bison"), "%.c$"), matching(filenamesof("+flex"), "%.c$"), }, deps = concat( headers, "+flex", - "+yacc", + "+bison", "modules/src/em_data+lib" ) } @@ -61,7 +61,21 @@ local function variant(name, cflags) srcs = { "+pattern_c", "+pop_push_c", - "./*.c", + "./alloc.c", + "./backward.c", + "./cleanup.c", + "./flow.c", + "./getline.c", + "./lookup.c", + "./main.c", + "./peephole.c", + "./process.c", + "./putline.c", + "./reg.c", + "./special.c", + "./tes.c", + "./util.c", + "./var.c", }, deps = concat( headers, @@ -70,6 +84,7 @@ local function variant(name, cflags) "modules/src/print+lib", "modules/src/string+lib", "modules/src/system+lib", + "modules/src/data+lib", "modules/src/em_data+lib" ), vars = { diff --git a/util/opt/cleanup.c b/util/opt/cleanup.c index 3ac39c53d..f82cdc1c1 100644 --- a/util/opt/cleanup.c +++ b/util/opt/cleanup.c @@ -31,7 +31,7 @@ void cleanup(void) c = fclose(outfile); assert(c != EOF); outfile = stdout; - infile = fopen(tempname, "r"); + infile = fopen(tempname, "rb"); if (infile == NULL) error("temp file disappeared"); outshort(sp_magic); diff --git a/util/opt/ext.h b/util/opt/ext.h index 342ab17c0..d4609a43b 100644 --- a/util/opt/ext.h +++ b/util/opt/ext.h @@ -16,7 +16,7 @@ extern bool repl_longmuls; extern byte em_flag[]; extern line_p instrs,pseudos; extern FILE *outfile; -extern char tempname[]; +extern char *tempname; extern offset wordsize; extern offset pointersize; extern char *progname; diff --git a/util/opt/main.c b/util/opt/main.c index 2856ffd33..415435f11 100644 --- a/util/opt/main.c +++ b/util/opt/main.c @@ -48,17 +48,14 @@ void fileinit(void) error("wrong input file"); if (Lflag) { - - if (sys_tmpnam(tempname)==NULL) - { - error("can't create temporary file."); - } + tempname = sys_maketempfile("opt", "dat"); outfile = fopen(tempname, "wb"); if (outfile == NULL) error("can't create %s", tempname); } else { + sys_setbinarymode(stdout); outfile = stdout; outshort(sp_magic); } @@ -84,8 +81,13 @@ int main(int argc, char* argv[]) exit(EXIT_FAILURE); } if (argc) - if (freopen(*argv, "r", stdin) == NULL) + { + if (freopen(*argv, "rb", stdin) == NULL) error("Cannot open %s", *argv); + } + else + sys_setbinarymode(stdin); + fileinit(); #ifdef USEMALLOC coreinit(); diff --git a/util/opt/var.c b/util/opt/var.c index 3e51a9a70..6085b5ba8 100644 --- a/util/opt/var.c +++ b/util/opt/var.c @@ -22,7 +22,7 @@ bool repl_longmuls = 0; /* replacing longmuls as well? */ line_p instrs,pseudos; /* pointers to chains */ sym_p symhash[NSYMHASH]; /* array of pointers to chains */ FILE *outfile; -char tempname[L_tmpnam]; +char *tempname; offset wordsize = 0; offset pointersize = 0; char *progname; diff --git a/util/shf/march.sh b/util/shf/march.sh deleted file mode 100755 index d1eb052bd..000000000 --- a/util/shf/march.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -: '$Id$' - -case $# in -3) makecmd=$3 ;; -2) makecmd=compmodule ;; -*) echo "Usage: $0 srcdir archname [ makecmd ]"; exit 1 ;; -esac - -errors=no -if test -r $1/LIST -then - ( - read archname - if test -r $1/$archname - then - arch x $1/$archname - for file in `arch t $1/$archname` - do - echo $file: 1>&2 - suffix=`expr $file : '.*\(\..*\)'` - ofile=`$makecmd $file $suffix` - if test $? != 0 - then errors=yes - fi - rm $file - OFILES="$OFILES $ofile" - done - else - while read file - do - echo $file: 1>&2 - suffix=`expr $file : '.*\(\..*\)'` - ofile=`$makecmd $1/$file $suffix` - if test $? != 0 - then errors=yes - fi - OFILES="$OFILES $ofile" - done - fi - if test $errors = no - then - if ${ASAR-arch} cr $2 $OFILES && ${RANLIB-:} $2 - then - rm $OFILES - fi - else - echo $2 not made, due to compilation errors - exit 1 - fi - ) < $1/LIST -else - echo no LIST file in directory $1 - exit 1 -fi diff --git a/util/shf/proto.make b/util/shf/proto.make deleted file mode 100644 index 986c3260a..000000000 --- a/util/shf/proto.make +++ /dev/null @@ -1,23 +0,0 @@ -# $Id$ - -#PARAMS do not remove this line! - -install: - -rm -f $(TARGET_HOME)/bin/march - cp $(SRC_HOME)/util/shf/march.sh $(TARGET_HOME)/bin/march - chmod +w $(TARGET_HOME)/bin/march - -clean: - @echo always clean - -lint: - @echo no C source files here - -cmp: - cmp $(SRC_HOME)/util/shf/march.sh $(TARGET_HOME)/bin/march - -opr: - make pr|opr - -pr: - @pr $(SRC_HOME)/util/shf/march.sh $(SRC_HOME)/util/shf/proto.make diff --git a/util/topgen/build.lua b/util/topgen/build.lua index 715632211..d0ff6513f 100644 --- a/util/topgen/build.lua +++ b/util/topgen/build.lua @@ -2,13 +2,19 @@ include("util/LLgen/build.lua") llgen { name = "llgen", - srcs = { "./*.g" } + srcs = { + "./topgen.g", + } } cprogram { name = "topgen", srcs = { - "./*.c", + "./hash.c", + "./LLlex.c", + "./main.c", + "./pattern.c", + "./symtab.c", matching(filenamesof("+llgen"), "%.c$"), }, deps = { diff --git a/util/topgen/topgen.g b/util/topgen/topgen.g index 0dc923929..72c08526c 100644 --- a/util/topgen/topgen.g +++ b/util/topgen/topgen.g @@ -1,349 +1,349 @@ -/* $Id$ */ -/* - * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. - * See the copyright notice in the ACK home directory, in the file "Copyright". - */ -/* t o p g e n . g - * - * Grammar of optimizer description, and some code generation - */ - -%token LETTER, DIGIT, OTHER, SPACE; -%token LINE_TERMINATOR, OPERAND_SEPARATOR, INSTRUCTION_SEPARATOR, - PATTERN_SEPARATOR, OPEN_BRACKET, CLOSE_BRACKET; -%lexical LLlex; -%start LLparse, optim_description; - -{ -#include -#include -#include -#include "token.h" -#include "symtab.h" -#include "misc.h" -#include "hash.h" -#include "pattern.h" - -char idbuf[BUFSIZ], buf[BUFSIZ]; -int countid; /* # of variables */ -int countpat; /* # of patterns */ -static int patlen; /* Maximum number of instructions in pattern */ -static int maxoperand; /* Maximum number of operands of instruction */ -extern FILE *input; /* file descriptor of inputfile */ - - - -extern int onlyspace(char* s); -extern void error(char *s, char* s1); - - -} - -optim_description - { struct symtab *p; } : - SPACE* parameters - { p = findident("MAXOP",LOOKING,&deftable); - if (p == 0) maxoperand = 2; /* default */ - else maxoperand = p->s_num; - } - separator SPACE* mode_definitions - separator SPACE* patterns - separator - { register int c; - fprintf(genc, linedir, lineno, inpfile); - while ((c = getc(input)) != EOF) { - putc(c,genc); - } - } -; - -parameters : - [ parameter_line | declaration_block ]* -; - -parameter_line - { struct symtab *p; - int lin; - } : - identifier - { p = findident(idbuf,ENTERING,&deftable);} - SPACE - { lin = lineno;} - value - { p->s_num = atoi(buf);} - /* This action in fact only needed for MAXOP */ - LINE_TERMINATOR - SPACE* - { fprintf(genh, linedir, lin, inpfile); - fprintf(genh,"#define %s %s\n",p->s_name,buf);} -; - -value - { char *p1 = buf;} : - [ - [ OPEN_BRACKET - | CLOSE_BRACKET - | OPERAND_SEPARATOR - | PATTERN_SEPARATOR - | INSTRUCTION_SEPARATOR - | SPACE - | LETTER - | DIGIT - | OTHER - | '%' - ] - { *p1++ = dot.t_attrib;} - ]* - { *p1 = '\0';} -; - -declaration_block : - OPEN_BRACKET - { fprintf(genh, linedir, lineno, inpfile);} - [ - [ LINE_TERMINATOR - | OPERAND_SEPARATOR - | PATTERN_SEPARATOR - | INSTRUCTION_SEPARATOR - | SPACE - | LETTER - | DIGIT - | OTHER - | '%' - ] - { putc(dot.t_attrib, genh);} - ]* - CLOSE_BRACKET - SPACE* - { putc('\n', genh);} -; - -mode_definitions - { int lin; } : - { fputs("int tok_chk(int varno) {\n\tint r;\n", genc); - fputs("\tchar *VAL;\n\n",genc); - fputs("\tVAL = var[varno].value;\n",genc); - fputs("\tswitch(varno) {\n",genc); - } - [ - token_list - constraint(&lin) - { fprintf(genc,linedir,lin,inpfile); - fprintf(genc,"\t\tr = (%s); break;\n",buf); - } - LINE_TERMINATOR - SPACE* - ]* - { fputs("\tdefault :\n\t\tassert(0);\n",genc); - fputs("\t}\n\treturn r;\n}\n\n",genc); - } -; - -token_list : - new_identifier - SPACE* - [ - OPERAND_SEPARATOR - SPACE* - new_identifier - SPACE* - ]* -; - -new_identifier - { struct symtab *p;} : - identifier - { p = findident(idbuf,ENTERING,&idtable); - p->s_num = ++countid; - fprintf(genc,"\tcase %d:\n", countid); - } -; - -constraint (int *lin;) - { char *p = buf; } : - OPEN_BRACKET - { *lin = lineno;} - [ - [ LINE_TERMINATOR - | OPERAND_SEPARATOR - | PATTERN_SEPARATOR - | INSTRUCTION_SEPARATOR - | LETTER - | DIGIT - | SPACE - | OTHER - | '%' - ] - { *p++ = dot.t_attrib;} - ]* - { *p = '\0'; - if (onlyspace(buf)) strcpy(buf,"TRUE"); - } - CLOSE_BRACKET - SPACE* -; - -patterns - { int lin; - char *constr; - int np, nr; - } : -[ - { countpat++; - constr = (char *) 0; - fprintf(genc,"struct instr_descr pat%d[] = {\n", - countpat); - } - instruction_list(&np) - { if (np > patlen) patlen = np; - fputs("\n};\n\n",genc); - } - [ - constraint(&lin) - { /* Save the constraint, we need it later on */ - constr = malloc((unsigned)(strlen(buf)+1)); - strcpy(constr,buf); - } - ]? - PATTERN_SEPARATOR - { fprintf(genc,"struct instr_descr rep%d[] = {\n", - countpat); - } - replacement(&nr) - { fputs("\n};\n\n",genc);} - LINE_TERMINATOR - SPACE* - { addpattern(constr,lin,np,nr);} -]* - { printhashtable(); - printpatterns(); - fprintf(genh,"#define NRVARS %d\n",countid); - fprintf(genh,"#define NRPATTERNS %d\n",countpat); - fprintf(genh,"#define MIN_WINDOW_SIZE %d\n", - patlen+3); - fclose(genh); - } -; - -instruction_list(int *n;) : - instruction(1) - { *n = 1;} - [ - INSTRUCTION_SEPARATOR - { fputs(",\n",genc);} - SPACE* - instruction(0) - { *n += 1;} - ]* -; - -instruction(int opt;) - { int count = 0;} : - opcode(opt) - { if (strcmp(buf,"ANY") != 0) { - fprintf(genc,"\t{\"%s\", {",buf); - } - else fputs("\t{(char *) 0, {",genc); - count = 0; - } - [ - operand(' ') - { count = 1;} - [ - OPERAND_SEPARATOR - { count++;} - SPACE* - operand(',') - ]* - { if (count > maxoperand) { - error("Too many operands",""); - } - } - ]? - { while (count++ < maxoperand) { - fprintf(genc,"%c{\"\",-1,\"\"}",count == 1 ? ' ' : ','); - } - putc('}',genc); - putc('}',genc); - } -; - -opcode(int opt;) - { char *p = buf;} : - [ - [ LETTER - | DIGIT - | OTHER - ] - { *p++ = dot.t_attrib;} - ]+ - SPACE+ - { *p = '\0'; - if (opt) addtohashtable(buf,countpat); - } -; - -operand(int c;) - { register struct symtab *p = 0;} : - { fprintf(genc, "%c{\"", c);} - [ - identifier - { if (!p) { - p = findident(idbuf,LOOKING,&idtable); - if (p) fprintf(genc,"\",%d,\"",p->s_num); - else fputs(idbuf,genc); - } - else fputs(idbuf,genc); - } - | DIGIT - { putc(dot.t_attrib,genc);} - | OTHER - { putc(dot.t_attrib,genc);} - ]+ - { if (p) fputs("\"}",genc); - else fputs("\",0,\"\"}",genc); - } - SPACE* -; - -replacement (int *n;) - {register int i;} : - SPACE* - { *n = 0;} - [ - instruction(0) - { *n = 1;} - [ - INSTRUCTION_SEPARATOR - { fputs(",\n", genc);} - SPACE* - instruction(0) - { *n += 1;} - ]* - | /* empty replacement, but there must be a - * structure initializer anyway - */ - { fputs("\t{\"\", {",genc); - for (i = 0; i < maxoperand; i++) { - fprintf(genc, "%c{\"\",-1,\"\"}",i?',':' '); - } - fputs("}}",genc); - } - ] -; - - -identifier - { char *p = idbuf; } : - LETTER - { *p++ = dot.t_attrib;} - [ %while (1) - LETTER { *p++ = dot.t_attrib;} - | DIGIT { *p++ = dot.t_attrib;} - ]* - { *p = '\0';} -; - -separator : - '%' '%' SPACE* LINE_TERMINATOR -; +/* $Id$ */ +/* + * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. + * See the copyright notice in the ACK home directory, in the file "Copyright". + */ +/* t o p g e n . g + * + * Grammar of optimizer description, and some code generation + */ + +%token LETTER, DIGIT, OTHER, SPACE; +%token LINE_TERMINATOR, OPERAND_SEPARATOR, INSTRUCTION_SEPARATOR, + PATTERN_SEPARATOR, OPEN_BRACKET, CLOSE_BRACKET; +%lexical LLlex; +%start LLparse, optim_description; + +{ +#include +#include +#include +#include "token.h" +#include "symtab.h" +#include "misc.h" +#include "hash.h" +#include "pattern.h" + +char idbuf[BUFSIZ], buf[BUFSIZ]; +int countid; /* # of variables */ +int countpat; /* # of patterns */ +static int patlen; /* Maximum number of instructions in pattern */ +static int maxoperand; /* Maximum number of operands of instruction */ +extern FILE *input; /* file descriptor of inputfile */ + + + +extern int onlyspace(char* s); +extern void error(char *s, char* s1); + + +} + +optim_description + { struct symtab *p; } : + SPACE* parameters + { p = findident("MAXOP",LOOKING,&deftable); + if (p == 0) maxoperand = 2; /* default */ + else maxoperand = p->s_num; + } + separator SPACE* mode_definitions + separator SPACE* patterns + separator + { register int c; + fprintf(genc, linedir, lineno, inpfile); + while ((c = getc(input)) != EOF) { + putc(c,genc); + } + } +; + +parameters : + [ parameter_line | declaration_block ]* +; + +parameter_line + { struct symtab *p; + int lin; + } : + identifier + { p = findident(idbuf,ENTERING,&deftable);} + SPACE + { lin = lineno;} + value + { p->s_num = atoi(buf);} + /* This action in fact only needed for MAXOP */ + LINE_TERMINATOR + SPACE* + { fprintf(genh, linedir, lin, inpfile); + fprintf(genh,"#define %s %s\n",p->s_name,buf);} +; + +value + { char *p1 = buf;} : + [ + [ OPEN_BRACKET + | CLOSE_BRACKET + | OPERAND_SEPARATOR + | PATTERN_SEPARATOR + | INSTRUCTION_SEPARATOR + | SPACE + | LETTER + | DIGIT + | OTHER + | '%' + ] + { *p1++ = dot.t_attrib;} + ]* + { *p1 = '\0';} +; + +declaration_block : + OPEN_BRACKET + { fprintf(genh, linedir, lineno, inpfile);} + [ + [ LINE_TERMINATOR + | OPERAND_SEPARATOR + | PATTERN_SEPARATOR + | INSTRUCTION_SEPARATOR + | SPACE + | LETTER + | DIGIT + | OTHER + | '%' + ] + { putc(dot.t_attrib, genh);} + ]* + CLOSE_BRACKET + SPACE* + { putc('\n', genh);} +; + +mode_definitions + { int lin; } : + { fputs("int tok_chk(int varno) {\n\tint r;\n", genc); + fputs("\tchar *VAL;\n\n",genc); + fputs("\tVAL = var[varno].value;\n",genc); + fputs("\tswitch(varno) {\n",genc); + } + [ + token_list + constraint(&lin) + { fprintf(genc,linedir,lin,inpfile); + fprintf(genc,"\t\tr = (%s); break;\n",buf); + } + LINE_TERMINATOR + SPACE* + ]* + { fputs("\tdefault :\n\t\tassert(0);\n",genc); + fputs("\t}\n\treturn r;\n}\n\n",genc); + } +; + +token_list : + new_identifier + SPACE* + [ + OPERAND_SEPARATOR + SPACE* + new_identifier + SPACE* + ]* +; + +new_identifier + { struct symtab *p;} : + identifier + { p = findident(idbuf,ENTERING,&idtable); + p->s_num = ++countid; + fprintf(genc,"\tcase %d:\n", countid); + } +; + +constraint (int *lin;) + { char *p = buf; } : + OPEN_BRACKET + { *lin = lineno;} + [ + [ LINE_TERMINATOR + | OPERAND_SEPARATOR + | PATTERN_SEPARATOR + | INSTRUCTION_SEPARATOR + | LETTER + | DIGIT + | SPACE + | OTHER + | '%' + ] + { *p++ = dot.t_attrib;} + ]* + { *p = '\0'; + if (onlyspace(buf)) strcpy(buf,"TRUE"); + } + CLOSE_BRACKET + SPACE* +; + +patterns + { int lin; + char *constr; + int np, nr; + } : +[ + { countpat++; + constr = (char *) 0; + fprintf(genc,"struct instr_descr pat%d[] = {\n", + countpat); + } + instruction_list(&np) + { if (np > patlen) patlen = np; + fputs("\n};\n\n",genc); + } + [ + constraint(&lin) + { /* Save the constraint, we need it later on */ + constr = malloc((unsigned)(strlen(buf)+1)); + strcpy(constr,buf); + } + ]? + PATTERN_SEPARATOR + { fprintf(genc,"struct instr_descr rep%d[] = {\n", + countpat); + } + replacement(&nr) + { fputs("\n};\n\n",genc);} + LINE_TERMINATOR + SPACE* + { addpattern(constr,lin,np,nr);} +]* + { printhashtable(); + printpatterns(); + fprintf(genh,"#define NRVARS %d\n",countid); + fprintf(genh,"#define NRPATTERNS %d\n",countpat); + fprintf(genh,"#define MIN_WINDOW_SIZE %d\n", + patlen+3); + fclose(genh); + } +; + +instruction_list(int *n;) : + instruction(1) + { *n = 1;} + [ + INSTRUCTION_SEPARATOR + { fputs(",\n",genc);} + SPACE* + instruction(0) + { *n += 1;} + ]* +; + +instruction(int opt;) + { int count = 0;} : + opcode(opt) + { if (strcmp(buf,"ANY") != 0) { + fprintf(genc,"\t{\"%s\", {",buf); + } + else fputs("\t{(char *) 0, {",genc); + count = 0; + } + [ + operand(' ') + { count = 1;} + [ + OPERAND_SEPARATOR + { count++;} + SPACE* + operand(',') + ]* + { if (count > maxoperand) { + error("Too many operands",""); + } + } + ]? + { while (count++ < maxoperand) { + fprintf(genc,"%c{\"\",-1,\"\"}",count == 1 ? ' ' : ','); + } + putc('}',genc); + putc('}',genc); + } +; + +opcode(int opt;) + { char *p = buf;} : + [ + [ LETTER + | DIGIT + | OTHER + ] + { *p++ = dot.t_attrib;} + ]+ + SPACE+ + { *p = '\0'; + if (opt) addtohashtable(buf,countpat); + } +; + +operand(int c;) + { register struct symtab *p = 0;} : + { fprintf(genc, "%c{\"", c);} + [ + identifier + { if (!p) { + p = findident(idbuf,LOOKING,&idtable); + if (p) fprintf(genc,"\",%d,\"",p->s_num); + else fputs(idbuf,genc); + } + else fputs(idbuf,genc); + } + | DIGIT + { putc(dot.t_attrib,genc);} + | OTHER + { putc(dot.t_attrib,genc);} + ]+ + { if (p) fputs("\"}",genc); + else fputs("\",0,\"\"}",genc); + } + SPACE* +; + +replacement (int *n;) + {register int i;} : + SPACE* + { *n = 0;} + [ + instruction(0) + { *n = 1;} + [ + INSTRUCTION_SEPARATOR + { fputs(",\n", genc);} + SPACE* + instruction(0) + { *n += 1;} + ]* + | /* empty replacement, but there must be a + * structure initializer anyway + */ + { fputs("\t{\"\", {",genc); + for (i = 0; i < maxoperand; i++) { + fprintf(genc, "%c{\"\",-1,\"\"}",i?',':' '); + } + fputs("}}",genc); + } + ] +; + + +identifier + { char *p = idbuf; } : + LETTER + { *p++ = dot.t_attrib;} + [ %while (1) + LETTER { *p++ = dot.t_attrib;} + | DIGIT { *p++ = dot.t_attrib;} + ]* + { *p = '\0';} +; + +separator : + '%' '%' SPACE* LINE_TERMINATOR +;